正则表达式是一个特殊的字符序列,他能帮助你方便的检查一个字符串是否与某种模式匹配。
RE模块使python语言拥有全部的正则表达式功能
- compile(pattern) 创建模式对象
- search(pattern,string) 在字符串中寻找模式
- match(pattern,string) 在字符串开始出匹配模式
- findall(pattern,string) 列表形式返回匹配项
- sub(pat,repl,string) 替换字符串中的匹配项
- split(pattern,string) 根据模式分割字符串
a = re.compile('asd') #a创建了asd对象来进行匹配 b = a.search('ASDASDasd') #b就是在ASDASDasd这个字符串中来寻找a的对象 print(b) c = a.match('ASDASDasd') print(c) #结果为none,在开始处并未匹配到a d = re.findall('asd','asdASDasdASDasd') print(d) #以列表形式返回匹配项,有几个就返回几个。 e = re.sub('asd' , 'aaa', 'asdASDasdASDasd') print(e) #aaaASDaaaASDaaa 把asd全部替换成了aaa f = re.split('\.' , 'a.b.c.d') print(f) #通过句号来分割字符串并输出列表形式 ['a', 'b', 'c', 'd']
正则表达式匹配修饰符
re.I 使匹配对大小写不敏感
re.L 做本地识别(locale-aware)匹配
re.M 多行匹配,影响^和$
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w , \W , \b , \B
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解
a1 = re.search('asd' , 'ASDASDASD') print(a1) #None a2 = re.search('asd' , 'ASDASDASD',re.I) print(a2) #<re.Match object; span=(0, 3), match='ASD'>
正则表达式匹配模式
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[...] 用来表示一组字符,单独列出:[amk]匹配'a' ,'m'或'k'
[^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
re^ 匹配0个或多个表达式
re+ 匹配1个或多个表达式
re? 匹配0个或1个有前面的正则表达式定义的片段,非贪婪方式
re{ n} 精确匹配n个前面表达式。例如,o{2}不能匹配”Bob“中的o,但是能匹配”food“中的两个o
re{ n,} 匹配n个前面表达式。 例如, o{2,}不能匹配”Bob“中的”o“,但能匹配”fooooood“中的所有o。 ”o{1,}“等价于”o+“。 ”o{0,}“则等价于”o^“
re{n,m} 匹配n到m次由前面的正则表达式定义片段,贪婪方式
a3 = re.findall('^asd' , 'asdASasdDASDasd') print(a3) #正常应该返回三个asd,但匹配开头的话就返回了一个 a4 = re.findall('.asd' , 'asdASasdDASDasd') print(a3) #['Sasd', 'Dasd']匹配asd和前面的任意字符 a5 = re.findall('.{2}' , 'asdASasdDASDasd') print(a5) #['as', 'dA', 'Sa', 'sd', 'DA', 'SD', 'as'] 匹配任意两个字符
特殊字符类匹配
. 匹配除”\n“之外的任何单个字符,要匹配保罗”\n“在内的任何字符,请使用像”[.\n]“的模式
\d 匹配一个数字字符,等价于[0-9]
\D 匹配一个非数字字符,等价于[^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于[^\f\n\r\t\v]
\w 匹配包括下划线的任何字符,等价于[^A-Za-z0-9_]
\W 匹配任何非单词字符,等价于[^A-Za-z0-9_]
a6 = re.findall('\d' , 'asdAS222asdDASDasd') print(a6) #['2', '2', '2'] a7 = re.findall('\D' , 'asdAS222asdDASDasd') print(a7) #['a', 's', 'd', 'A', 'S', 'a', 's', 'd', 'D', 'A', 'S', 'D', 'a', 's', 'd']
贪婪模式和非贪婪模式
正则则表达式通常用于在文本中查找匹配的字符串。python里的数量词默认是贪婪的,意思是总是尝试匹配尽可能多的字符;
非贪婪的则相反,总是尝试匹配尽可能少的字符
*?.+?.??.{m,n}?
前面的*.+.?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
例如:正则表达式“ab*”如果用于查找”abbbc“
将找到“abbb”,而如果使用非贪婪方式“ab*?”,将找到“a”
a8 = re.findall('ab*' , 'abbbc') print(a8) #['abbb'] a8 = re.findall('ab*?' , 'abbbc') print(a8) #['a']