在python中,正则是一个引过来的模块,叫re模块
就本质来说,正则表达式是一种小型的,高度专业化的编程语言,内嵌在python中
正则的作用简单来说就是模糊匹配,而且只对字符串处理,而且由于它是由C编写的所以运行速度特别的快
1、普通字符:大多数字符和字母都会和自身匹配
>>>import re
>>>re.findall('yibole','asdafalajyiboleasdaswvxcvse'
['yibole']
2、元字符: . ^ $ * + ? {} [] | ()
.点是通配符,除了换行符\n不行其他的字母、数字,都能匹配到,一个点代表一个符号,两个点代表
re.findall("a..x"."ajhxqrqoijvlkwejr")
^是以什么开头的意思,只能在字符串开头去匹配内容:
re,findall("^as..x","asqqxasdwqfdfa")
$是以什么什么结尾,只能在字符串的末尾去匹配
re,findall("as..x$","asqqxasdwqfdfaasrrx")
*的意思是范围(0,正无穷)
+的意思是范围(1,正无穷)
>>> re.findall("yibole*","ajndqwjnyasqwwyibol")
['yibol']
>>> re.findall("yibole+","ajndqwjnyasqwwyibol")
[]
?的意思是范围(0,1)它可以匹配0次或者1次
>>> re.findall("yibole?","ajndqwjnyyibolq")
['yibol']
{}大括号代表可以写一个范围,{0,正无穷}*,{1,正无穷}+,{0,1}==?,{6}就是循环6次
>>> re.findall("yibole{2,5}","ajndqwjnyyiboleeeq")
['yiboleee']
前面的+*?都是贪婪匹配,如果想变成惰性匹配就需要在后面加一个?就行了
>>> re.findall("yibole*?","qweqweyiboleee")
['yibol']
>>> re.findall("yibole+?","qweqweyiboleee")
['yibole']
字符集[]:[]的第一个意思是或的意思,这里为yi开头中间b或o之后以le结尾
>>> re.findall("yi[bo]le","asfjqwyibleyioleyibole")
['yible', 'yiole']
其次,在[]中没有特殊符号
>>> re.findall("yi[b*o]","asfjqwyeyibbbbbbbbb")
['yib']
>>> re.findall("yi[b*o]","asfjqwyeyibbbbyi*")
['yib', 'yi*']
但是在中括号内写[a-z]是指a到z所有的小写字母,加上*就是取q后面所有的a-z的内容,它是按照ascii码来排序的,所以如果需要a-Z就在括号中写入[a-Z]就可以了
>>> re.findall("q[a-z]*","aafaewqqqwewe")
['qqqwewe']
如果在字符集中加入后,比如[a-z],意思就是非,代表不是a-z就可以匹配了
>>> re.findall("q[^a-z]","qweq123qq")
['q1']
在字符集中的\是转译符,可以让有意义的变成无意义,无意义变成有意义的:
>>> re.findall("\([^()]*\)","(1+2+(1-2)")
['(1-2)']
\d匹配任何十进制数,他相当于类[0-9]
\D匹配任何非数字字符,他相当于[^0-9]
\s匹配任何空白字符,相当于[\t\n\r\f\v]
\S匹配任何非空白字符,相当于[^\t\n\r\f\v]
\w匹配任何数字字母字符,相当于[a-zA-Z0-9_]
\W匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]
\b匹配特殊字符边界,比如空格,&,#等
>>> re.findall("\d+","(11+22+(1-2)")
['11', '22', '1', '2']
>>> re.findall("\D+","(11+22+(1-2)")
['(', '+', '+(', '-', ')']
>>> re.findall("\s+","hello world")
[' ']
>>> re.findall("\S+","hello world")
['hello', 'world']
>>> re.findall("\w+","hello world")
['hello', 'world']
>>> re.findall("\W+","hello world")
[' ']
但是转义字符\在python中和re中有相同的作用,所以在使用中如果需要匹配字符串中带有\的字符,就需要两次转义,或者在字符串前写上r让python编译器不转义:
>>> re.findall("I\\b","I AM LIST")
['I']
>>> re.findall(r"I\b","I AM LIST")
['I']
|是或的意思,()是分组
>>> re.findall(r"ka|ab","asfsaabdka")
['ab', 'ka']
>>> re.findall("(abc)+","abcawdabc")
['abc', 'abc']
匹配时不仅可以使用findall还可以使用search,findall是把字符串中所有正确匹配的数全部取出来,而search查询到第一个正确的值之后后面的就不再查询了,而匹配成功了之后把这个对象的值取出来就需要用group:
>>> re.search("\d+","asdafasdasd34asdw555").group()
'34'