njsuntop 发表于 2018-8-13 08:42:48

python笔记-正则表达式

  正则表达式

[*]  匹配
  \d 匹配一个数字
  \w 匹配一个字母或一个数字
  \s 匹配一个空格或tab空白符
  \b 匹配字符边界
  以上特殊字符变成大写,表示与之相反。
  \N 匹配已保存的子组
  ^或\A 匹配字符串的开始
  $或\Z 匹配字符串的结束
  .匹配任意一个字符

[*]  个数
  + 表示其前面的字符串至少出现了一次
  ? 表示其前面的字符出现了一次或零次
  * 表示其前面的字符出现了任意次,可能是零次、一次或多次
  {n} 表示其前面的字符串出现了n次
  {n,m} 可以表示其前面的字符串出现了n-m次
  [] 匹配一个范围,例如可以匹配一个数字、字母或者下划线,[]中以^开头表示"非"

[*]  转义
  \ 表示转义
  r'' 引号中的特殊字符会被转义(建议使用这种,不用考虑转义问题)

[*]  re模块
  match()方法    判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串'  
re.match(r'正则表达式',str,flags)
  例如:
import re  
find1 = re.match(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','127.0.0.1')
  
print("find1:%s,%s"%(find1,find1.group()))
  
#打印内容
  
find1:<_sre.SRE_Match object; span=(0, 9), match='127.0.0.1'>,127.0.0.1
  
  search()方法   在指定的字符串中,查找第一个能够匹配成功的字符串,如果匹配成功,返回一个Match对象,否则返回None。常见语法如下:
str = '用户输入的字符串'  
re.search(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find2 = re.search(r'\d{11}',str)
  
print(&quot;find2:%s,%s&quot;%(find2,find2.group()))
  
#打印内容
  
find2:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000
  
  findall()方法    在指定的字符串中,查找所有匹配成功的字符串,如果匹配成功,返回一个列表,包含所有匹配成功的字符串,否则返回空列表。常见语法如下:
str = '用户输入的字符串'  
re.findall(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find3 = re.findall('\d{11}',str)
  
print(&quot;find3:%s&quot;%find3)
  
#打印内容
  
find3:['15810740000','12346010473']
  
  finditer()方法    与findall类似,只不过返回的是个callable_iterator迭代器,python2中支持next方法去遍历,python3中不支持。常见语法如下:
str = '用户输入的字符串'  
re.finditer(r'正则表达式',str,flags)
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
find4 = re.finditer('\d{11}',str)
  
for i in find4:
  
    print(&quot;find4:%s,%s&quot;%(i,i.group()))
  
#打印内容
  
find4:<_sre.SRE_Match object; span=(12, 23), match='15810740000'>,15810740000
  
find4:<_sre.SRE_Match object; span=(46, 57), match='12346010473'>,12346010473
  sub()、subn()方法    搜索和替换,sub返回替换后的字符串,subn返回一个元组,元素分别是替换后的字符串和替换的个数。如果没有正确的匹配替换,将返回原字符串,常见语法如下:
str = '用户输入的字符串'  
re.sub(r'正则表达式',repl,str,count=0)
  
re.subn(r'正则表达式',repl,str,count=0)
  
#使用repl替换正则表达式在str中匹配的部分,如果指定count个数,将替换对应的个数,否则将全部替换
  例如:
str = 'my phone is 15810740000 ,my friend\'s phone is 12346010473'  
sub1 = re.sub('(\d{11})',r'+86 \1',str)
  
print(&quot;sub1:%s&quot;%(sub1))
  
sub2 = re.subn('(\d{11})',r'+86 \1',str)
  
print(&quot;sub2:%s,共替换%s处&quot;%(sub2))
  
#打印内容
  
sub1:my phone is +86 15810740000 ,my friend's phone is +86 12346010473
  
sub2:my phone is +86 15810740000 ,my friend's phone is +86 12346010473,共替换2处
  注:在sub1、sub2正则表达式中都用了一个'\1',表示的就是匹配的字符串。
  '(\d{11})'用了小括号,表示分组,'\1'表示分组的编号,这里只有一对小括号(一组),'\1'对应的就是全部匹配字符串。
  split()方法    与字符串分割的方法类似,但是功能更加强大,常见语法如下:
str = '用户输入的字符串'  
re.split('正则表达式',str,maxsplit=0)
  
#指定maxsplit个数只分割对应的个数,不指定将全部分割。python2中该参数为max
  例如:
str = 'root:x:0:0:root:/root:/bin/bash'  
print(re.split(':',str,maxsplit=5))
  
#打印内容
  
['root', 'x', '0', '0', 'root', '/root:/bin/bash']
  补充:
  匹配对象的方法group(num=0)和groups()    group()返回匹配对象整个匹配的结果,对于含有子组的匹配对象来说,指定num,将返回对应的子组;groups()返回一个元组,包含匹配的每个子组,如果没有成功匹配,返回一个空元组,例如:
import re  
str = '158107470000@163.com'
  
reg = r'(\w+)@(\w+).com'
  
find1 = re.match(reg,str)
  
print(find1.group(),find1.group(1),find1.group(2))
  
print(find1.groups())
  
#打印内容
  
158107470000@163.com 158107470000 163
  
('158107470000', '163')
  常用属性    re模块还包括一些常用的属性,可以在匹配时作为flags使用,如下:
#re.I、re.IGNORECASE    不区分大小写的匹配  
#re.L、re.LOCALE      根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S 实现匹配
  
#re.M、re.MULTILINE    ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾
  
#re.S、rer.DOTALL      “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示“.”(点号)能够匹配全部字符
  
#re.X、re.VERBOSE      通过反斜线转义,否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非在一个字符类中或者允许注释并且提高可读性

[*]  分组
  () 小括号中匹配的分为一组,常用功能:简洁代码、字串提取,例如:
#匹配ip地址,相同的部分写成了一组  
import re
  
re.match(r'(\d{1,3}.){3}\d{1,3}','127.0.0.1')
#识别时间,提取小时、分钟、秒  
import re
  
t = '23:05:30'
  
m = re.match(r'^(0|1|2|):(0|1|2|3|4|5|):(0|1|2|3|4|5|)$', t)
  
print (m.groups())
页: [1]
查看完整版本: python笔记-正则表达式