正则表达式匹配规则:
匹配单个字符:
1.匹配某个字符
text = 'hello' ret = re.match('he',text) print(ret) # 输出结果 <re.Match object; span=(0, 2), match='he'> print(ret.group()) # 输出结果:he
2. 点(.):匹配除换行符外的任意字符
text = 'hello' ret = re.match('.',text) print(ret) # 输出结果 <re.Match object; span=(0, 1), match='h'>
3.1 \d:匹配任意数字(0-9)
text = '298' ret = re.match('\d',text) print(ret) # 输出结果 <re.Match object; span=(0, 1), match='2'>
3.2 \D:匹配任意的非数字
text = '2' ret = re.match('\D',text) print(ret) # 输出结果 None text = 'a' ret = re.match('\D',text) print(ret) # 输出结果 <re.Match object; span=(0, 1), match='a'
4.1 \w: 匹配a-z,A-Z以及数字和下划线
text = 'a_298' ret = re.match('\w',text) print(ret) # 输出结果 <re.Match object; span=(0, 1), match='a'> # 如果匹配一个其他字符,那么就匹配不到。 text = '+' ret = re.match('\w',text) print(ret) # 输出结果 None
4.2 \W:匹配的是和\w相反的,即:\w匹配不到的\W能匹配到
text = '+' ret = re.match('\W',text) print(ret) # 输出结果 <re.Match object; span=(0, 1), match='+'> text = 'a_298' ret = re.match('\W',text) print(ret) # 输出结果 None
5. \s:匹配空白字符串(\n,\t,\r,空格)
text = '\n' ret = re.match('\s',text) print(ret) # 输出结果<re.Match object; span=(0, 1), match='\n'>
6.[]组合的方式进行匹配,只要满足中括号中的某一项都算匹配成功
text = '0371-888adaes' ret = re.match('[\d\-]+',text) print(ret) # 输出结果<re.Match object; span=(0, 8), match='0371-888'> print(ret.group()) # 输出结果:0371-888
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 6.1 []代替\d text = '0371' ret = re.match('[0-9]',text) print(ret.group()) # 输出结果:0 # 6.2 []代替\D text = '0371' ret = re.match('[^0-9]',text) print(ret.group()) # 输出结果:'NoneType' object has no attribute 'group' # 6.3 []代替\w text = '_' ret = re.match('[a-zA-Z0-9_]',text) print(ret.group()) # 输出结果:_ # 6.4 []代替\W text = '0' ret = re.match('[^a-zA-Z0-9_]',text) print(ret.group()) # 输出结果:'NoneType' object has no attribute 'group' text = '+' ret = re.match('[^a-zA-Z0-9_]',text) print(ret.group()) # 输出结果:+
匹配多个字符
1. * :可以匹配0或者任意多个字符
text = '037' ret = re.match('\d*',text) print(ret.group()) # 输出结果:037
2. + : 可以匹配一个或者多个字符,最少一个。>=1
text = '037' ret = re.match('\d+',text) print(ret.group()) # 输出结果:037 text = '' ret = re.match('\d+',text) print(ret.group()) # 输出结果:'NoneType' object has no attribute 'group'
3. ? : 匹配一个或者0个
text = 'abcd' ret = re.match('\w?',text) print(ret.group()) # 输出结果:a
4. {m} : 匹配m个字符
text = 'abcd' ret = re.match('\w{2}',text) print(ret.group()) # 输出结果:ab
5. {m,n} : 匹配m-n个字符,字符串足够长时,输出n个字符串。
text = 'abcdfgd' ret = re.match('\w{1,5}',text) print(ret.group()) # 输出结果:abcdf
特殊符号
^(脱字号):表示以...开始。如果在[]中表示取反操作
text = "hello" ret = re.match('^h',text) print(ret.group()) # 输出结果:h
$: 表示以...结束
text = "xxx@163.com" ret = re.match('\w+@163\.com$',text) print(ret.group()) # 输出结果:xxx@163.com
|: 匹配多个表达式或者字符串
text = "hello|word" ret = re.match('hello',text) print(ret.group()) # 输出结果:hello
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 验证手机号码:手机号的规则是:1开头,第二位可以是34578,后面九位随意。 # text = '13566666666' # ret = re.match('1[34578]\d{9}',text) # print(ret.group())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 验证邮箱:邮箱的规则是邮箱名是用数字、字母、下划线组成的,然后是@符合,后面是域名。 # text = 'henan12@163.com' # ret = re.match('\w+@\w+\.[a-z]+',text) # print(ret.group())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 验证URL # text = "https://baike.baidu.com/item/Python/407313?fr=aladdin" # ret = re.match('(http|https|frp)://[^\s]+',text) # print(ret.group())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 验证身份证 # text = "15555555555584996X" # ret = re.match('\d{17}[\dxX]',text) # print(ret.group())
贪婪模式和非贪婪模式:
贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪匹配。
非贪婪匹配:正则表达式会尽量少的匹配字符。
# 贪婪匹配 text = "15577849" ret = re.match('\d+',text) print(ret.group()) # 输出结果:15577849 # 非贪婪匹配 text = "15577849" ret = re.match('\d+?',text) print(ret.group()) # 输出结果:1
转义字符和原生字符
在正则表达式中,有些字符具有特殊含义,如果要匹配这些字符,就必须使用反斜杠"\"进行转义。
比如$代表的是以...结尾,如果要匹配$,就必须使用\$。
# match 遍历一个字符,search遍历整个字符串 text = "app price is $88" ret = re.search('\$(\d+)',text) print(ret.group()) # 输出结果:$88
原生字符:在正则表达式中,\是专门用来转义的。在python中\也是用来做转义的。因此,如果想要在普通的字符串中匹配出\,那么要给出四个\。
text = "app \c" ret = re.search('\\\\c',text) print(ret.group()) # 输出结果:\c #使用原生字符串 text = "app \c" ret = re.search(r'\\c',text) print(ret.group()) # 输出结果:\c
python中re模块的常用函数
match:
从开始的位置进行匹配,如果开始的位置没有配到,那么就失败。
search:
在整个字符串中查找字符。如果找到,就返回查找到的第一个满足条件的字符;如果没有找到,就失败。
分组:
在正则表达式中,可以对过滤到的字符串进行分组。分组使用()。
1. group():与group(0)等价,返回的是符合整个满足条件的字符串。
2. groups: 返回的是里面的子组。索引从1开始。
3. group(1): 返回的是第一个子组,可以传入多个。
text = "app price is $88,book price is $20" ret = re.search(r'.*(\$\d+).*(\$\d+)',text) print(ret.group()) # 输出结果:app price is $88,book price is $20 print(ret.group(0)) # 输出结果:app price is $88,book price is $20 print(ret.groups()) # 输出结果:('$88', '$20') print(ret.group(2)) # 输出结果:$20
findall:
找出所有满足条件的,返回的是一个列表。
text = "app price is $88,book price is $20" ret = re.findall('\$\d+',text) print(ret) # 输出结果:['$88', '$20']
sub:
用来替换字符串,将匹配到的字符串使用指定的字符串替换掉。
text = "app price is $88,book price is $20" ret = re.sub('\$\d+','5',text) print(ret) # 输出结果:app price is 5,book price is 5
split:
使用正则表达式分割字符串。
text = "hellow&world you hao" ret = re.split('[^a-zA-Z]',text) print(ret) # 输出结果:['hellow', 'world', 'you', 'hao']
compile:
对于一些经常用到的正则表达式,可以使用complie进行编译,后期使用时直接拿去使用,这样执行效率更快。
而complie可以指定 "flag=re.VERBOSE "。在写正则表达式时最好做好注释。
text = "the nimber is 20.65" r= re.compile(r""" \d+ #小数点前面的数字 \.? #小数点本身 \d* #小数点后面的数字 """,re.VERBOSE) ret = re.search(r,text) print(ret.group())# 输出结果:20.65