正则表达式
正则表达式的元字符
记号 说明 示例 示例解释 literal 匹配该字符 this 匹配this re1|
re2 为管道符号,表示多选一 wang|
guo wang或者guo .
除了换行符之外的任意字符 a.d aad,abd,ad… \d 任意数字同[0-9]和\D是反义词 \d{11} 表示11位数字 \D 非数字字符 \D{5} 5个非数字字符 \w 匹配任意数字和字母同[A-Za-Z0-9] \w+ 数字和字符构成的字符串均可匹配到 \W 匹配非数字字母 \s 匹配空白字符符号 \S 匹配非空白符号 范围 […] 括号包括的仁和一个字符 [aeiou] a,e,i,o,u的任意一个 [x-y] 匹配x-y区间内的字符可以有多个区间 [0-9匹配所有数字] a-zA-z匹配所有的字母 [^…] 不匹配^后面的字符 ^aeiou 不匹配a,e,i,o,u任何一个字母 边界 ^ 匹配行的开始,多行模式(MULTILINE)匹配模式时,可匹配任意行的开头 ^Dear 匹配所有Dear开头的字符 $ 匹配行的结束,如果最后是一个换行符号以这个换行符号前面的字符为准,多行模式匹配任意行的结尾 txt$ 匹配以txt结尾的字符串 \b 匹配单词的边界 \bthe\b 匹配the不匹配there与together \A 匹配整个字符串的开始,不支持多行模式 \Aabc 整个字符串abc开头匹配不上xyz\nabc \Z 仅匹配整个字符串的结束,不支持多行模式匹配 def\Z 整个字符串匹配以def结尾。匹配不上def\nxyz 次数 * 前面的内容出现零到多次 5* 0个或多个5 + 内容前面出现1次到多次 a+ 1个或多个a ? 前面内容出现0次或1次 N? 0或1个N {N} 前面内容出现N次 X{5} 5个X {M,N} 前面出现M次到N次 W{2,5} 2到5个W 非贪婪 (次数)?(*|+|?|{})?
次数后面加问号表示非贪婪匹配,即找出长度最小切符合要求的 “.+?” 匹配引号引起来的部分,比如“a”,“b”,“c”,如果左边的正则表达式中没有问好,则会贪婪匹配整个字符串。但是左边的正则表达式中有问好只会匹配“a”,“c” 子组 (正则表达式) 圆括号中匹配的内容会保留为子组(或者称为子模式) ([0-9]{3}) 连续三个数字构成一个子组 (?P<name>...
) 明明的子组 ?P<name>\w+
子组的名字叫做name \子组编号 匹配已保存的子组,参考上面的(正则表达式) (\w)\1 两个词连续出现 (?:
) 虽然用括号括起来不算子组 (?:beijing|
xiangtan)universite beijing university或xiangtan university \
取消通配符的特殊含义 \. 匹配字符.本身
正则表达式核心函数
方法 说明 re.compile(pattern) 返回一个regex对象 若用regex对象,一下pattern参数不需要传入 re.compile(pattern.match(string)) re.match(pattern,string) 匹配(从字符串的开头开始) re.search(pattern,string) 搜索(在字符串中找有没有符合的字符串) re.findall(b ) 找出所有返回列表 re.split(pattern,string,max = 0) 符合pattern处进行分割,返回列表,max可以指定最多分割的次数 re.sub(pattern,repl,string,max = 0) 字符串替换,把string中符合pattern的部分替换成repl字符串 re.subn(re.sub(pattern,repl,string,max = 0)) 和上面re.sub类似但是多返回一个次数
import re
a = re. match( r'\d{3}' , '12345a6789' )
a
<re.Match object; span=(0, 3), match='123'>
a = re. search( r'\d{3}' , '123456789' )
print ( a)
<re.Match object; span=(0, 3), match='123'>
a = re. findall( r'\d{11}' , 'asd123456789123sdf' )
print ( a)
['12345678912']
a = re. split( r'\d' , 'asdf3a54er' )
a
['asdf', 'a', '', 'er']
a = re. sub( r'\d' , '0' , 'a1b2c3' )
a
'a0b0c0'
re. sub( r'(\w+)\1' , r'\1' , 'the the little cat in the the hat' )
'the the litle cat in the the hat'
re. findall( r'(?:beijing|zhejiang)' , 'beijing & zhejiang' )
['beijing', 'zhejiang']
理解贪婪和非贪婪
s = '<string>Weizhong Tu</string><string>Python is interesting</string>'
pattern = "<string>(.+)</string>"
reg = re. compile ( pattern)
print ( reg. findall( s) )
['Weizhong Tu</string><string>Python is interesting']
pattern = "<string>(.+?)</string>"
reg = re. compile ( pattern)
print ( reg. findall( s) )
['Weizhong Tu', 'Python is interesting']