Python 基础入门 8_1 正则表达式

"""
自1.5版本后,引入re模块,使python可以写正则表达式,正则表达式是用来判断或者返回指定匹配模式的字符串:
比如说:密码规则需要大小写字母和数字组成,如果我们输入字符串来判断复合密码规则,需要许多的判断语句,
而用正则表达式则可以很快的判断出这个字符串是否符合字符串的要求,减少了代码的工作量

python正则表达式的实现需要引用 re模块:import re
re模块的函数常用的有三个参数:
pattern:编写规则,用来配对字符串是否符合规则:
pattern = "pa" ,该规则为第一个字符为p,第二个字符的为a的字符串规则
string:要匹配的字符串
flags: 标识符,标志位,用于控制正则表达式的匹配方式
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^和$ ,如果要匹配的字符串为多行,需要赋这个值,不然只会匹配该字符的第一行,其他行不匹配
re.S 是.匹配包括换行符在内的所有字符
re.U 根据Unicode字符集解析字符,影响W W 
re.X 使我们以更灵活的格式理解正则表达式

re.match(pattern,string,[flag]) 函数
功能:从参数string字符串开始位置判断是否符合pattern规则,是返回一个'_sre.SRE_Match'对象,不是返回None
"""
import re
patter1,patter2 = "www","wwW" #patter1 规则第一到第三位为w,patter2的规则从第一到第二为w,第三位为W
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print(re.match(patter1,string1)) #返回对象 从string1的起始位置,前三位都为w,与patter1的规则符合
print(re.match(patter1,string2)) #返回 None 从string2的起始位置,前三位为ww. 与patter1的规则不符合
print(re.match(patter1,string3)) #返回对象 从string3的起始位置,前三位都为w,与patter1的规则符合
print(re.match(patter1,string4)) #返回None 从string4的起始位置,前三位为bai,与patter1的规则不符合
print(re.match(patter2,string1)) #返回None 从string1的起始位置,前三位都为w,与patter2(前三位为wwW)的规则不符合
print(re.match(patter2,string1,re.I)) #返回对象 从string1的起始位置,前三位都为w,与patter2(前三位为wwW)的规则不符合,
# 但flag的参数为re.I,这个值是忽略大小写,即可以将patter2的规则看成www,所以string1符合要求

"""
re.search(pattern,string,[flag]) 函数
功能:从string字符串中判断是否有包含pattern规则,有返回对象,没有返回None
"""
patter1,patter2 = "www","wwW"
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("1==============================")
print(re.search(patter1,string1)) #返回对象
print(re.search(patter1,string4)) #返回对象
print(re.search(patter2,string1,re.I)) #返回None

"""
re.findall(pattern,string,[flag]) 函数
功能:从string字符串中是否有包含pattern规则,有则返回能匹配pattern规则字符的列表,没有返回空列表
(可以知道这字符串可以有多少个匹配pattern规则的)
"""
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("2--------------------------------")
print(re.findall(patter1,string1)) #返回["www","www"]列表
print(re.findall(patter1,string2)) #返回[]列表

R"""
pattern的单字符规则:
. 匹配除换行符以外的任意字符
^ 脱字符,表示不匹配集合的字符,与字符集合搭配
d 匹配数字,效果同[0-9]
D 匹配非数字字符,效果同[^0-9]
w 匹配数字,字母和下划线,同[0-9a-zA-Z_]
W 匹配非数字,字母和下划线,同[^0-9a-zA-Z_]
s 匹配空白符(空格,换行,回车,换页,制表),同[ f ]
S 匹配非空白符,同[~ f ]

[0123456789] []是字符集合,表示匹配括号中所包含的任意一个字符,该字符集合是匹配数字
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[0-9a-zA-Z_] 匹配任意的数字、字母和下划线
"""
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("3+++++++++++++++++++++++++")
print(re.search(".",string1)) #返回对象
print(re.search("d",string1)) #返回None
print(re.search("w",string1)) #返回对象
print(re.search("s",string1)) #返回对象
print(re.search("[0-9]",string1)) #返回None

R"""
pattern(正则表达式)的锚字符(即边界字符)的规则,
^str 行首匹配,和在[]里的^表示的不一样
str$ 行尾匹配
Astr 匹配字符串开始位置 ,与^的区别是,^字符串为多行时,返回每行首匹配,A是只匹配第一行的开头
str 匹配字符串结束,与$的区别是,$字符串为多行时,返回每行尾匹配,是只匹配第一行的结尾
str 匹配一个单词的边界
strB 匹配一个非单词的边界
"""
print("4+++++++++++++++++++++++++")
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print(re.search("^www",string3))      #返回对象
print(re.search("^www",string2)) #返回None
print(re.search("com$",string2)) #返回对象

string5 = "www.hjlin.com www.baidu.com"
print(re.findall("^www",string5)) #返回["www"]
print(re.findall("^www",string5,re.M)) #返回["www","www"]
print(re.findall(r"Awww",string5)) #返回["www"]
print(re.findall(r"Awww",string5,re.M)) #返回["www"]

print(re.findall("com$",string5)) #返回["com"]
print(re.findall("com$",string5,re.M)) #返回["com","com"]
print(re.findall(r"com",string5)) #返回["com"]
print(re.findall(r"com",string5,re.M)) #返回["com"]

print(re.search(r"er","ever")) #返回对象
print(re.search(r"er","everst")) #返回None
print(re.search(r"erB","ever")) #返回对象
print(re.search(r"erB","everst")) #返回None


R"""
正则表达式 指定多个字符串为规则
str 以str为整体去匹配
str? 以0个或者1个str为整体去匹配
str1|str2 以str1或者str2为整体去匹配

#以下str,只能为单个字符,若str是多个字符组成的字符串,效果会于结果不一致或返回None(空列表)
str* 以多个str为整体去匹配
str+ 以至少一个str为整体去匹配
str{int} 以int个str为整体去匹配
str{int,} 以至少int个str为整体去匹配
str{int,int1} 以至少int个,最多int1个str为整体去匹配
"""
print("5+++++++++++++++++++++++++++++")
print(re.findall("hjl","hjl hjl hjl")) #返回["hjl","hjl","hjl"]
print(re.findall("hjl","h j l h j l h j l")) #返回[]

print(re.findall("hjl?","hjl hjl hjl")) #返回["hjl","hjl","hjl"],因为hjl不为一个字符的字符串,因此导致结果于hjl的规则一致
print(re.findall("hjl?","hjlhjlhjl ")) #返回["hjl","hjl","hjl"],因为hjl不为一个字符的字符串,因此导致结果于hjl的规则一致
print(re.findall("a?","aaa")) #返回["a","a","a",""]
print(re.findall("a","aaa")) #返回["a","a","a"]

print(re.findall("a*","abaabbaaabbbaaaabbbb")) #返回["a","","aa","","","aaa","","","","aaaa","","","",""]
print(re.findall("hjl*","hjlhjlhjl ")) #返回["hjl","hjl","hjl"]

print(re.findall("a+","abaabbaaabbbaaaabbbb")) #返回["a","aa","aaa","aaaa"]
print(re.findall("hjl+","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回["hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl"]

print(re.findall("a{2}","abaabbaaabbbaaaabbbb")) #返回["aa","aa","aa","aa"]
print(re.findall("hjl{2}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]
print(re.findall("a{2,}","abaabbaaabbbaaaabbbb")) #返回["aa","aaa","aaa"]
print(re.findall("hjl{2,}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]
print(re.findall("a{2,3}","abaabbaaabbbaaaabbbb")) #返回["aa","aaa","aaa"]
print(re.findall("hjl{2,3}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]

print(re.findall("hjl|hjj" , "hjlbhjj")) #返回["hjl","hjj"]
print(re.findall("h|j","hjl")) #返回["h","j"]

str="hjl is a man!hjl is a good man!hjl is a very good man"
print(re.findall(r"hjl.*man",str)) #返回["hjl is a man !hjl is a good man !hjl is a very good man"]
print(re.findall(r"hjl.*?man",str)) #返回["hjl is a man","hjl is a good man","hjl is a very good man"]
#针对上述的两句正则进行说明:第一个规则为以 开头前三个为hjl,最后的三个为man,中间是除换行符之外的任意字符,可以有多个
#第二个规则,再第一个规则的基础上,规定了开头和中间的部分为一个整体去匹配,即当程序遇到了第二个hjl,后面的内容和中间部分匹配,算第二个整体。
原文地址:https://www.cnblogs.com/hjlin/p/10660633.html