本文共 2877 字,大约阅读时间需要 9 分钟。
本人经过1周的汇总,整理如下,欢迎补充改正。
目录:
re模块-概述 2018/6/14 2018/12/16
1.使用说明
1).适用对象: # Unicode字符串(str)以及8位字符串(bytes);不能混用2).匹配字符: # 1)字母数字和特殊字符('!"%\',/:;<=>@_`')匹配自己 # 2)元字符与自身不匹配。如需使用需转义'#$&()*+-.?[\\]^{|}~';如'|':\|或[|];'$':\$或 [$] 3).反斜杠: # r"\n"使用原始字符串4).使用方法: # 获取模式并调用它的方法:在循环中访问正则表达式,预编译它将节省一些函数调用。 # 模块级函数:在循环之外,由于内部缓存,没有太大区别。
实例:
# 实例1:模式对象:p = re.compile('[a-z]+')#编译正则表达式的对象 # re.compile('[a-z]+')m = p.match('tempo') #匹配对象 #m.group() #返回RE匹配的子字符串 # 'tempo'm.start(), m.end() #返回匹配的开始和结束索引 # (0, 5)m.span() #在单个元组中返回开始和结束索引 # (0, 5)# 实例2:模块级函数re.match('[a-z]+','tempo').group() #'tempo'# 实例3:匹配行的末尾re.search('}$', '{block}').group() #'}'re.search('}$', '{block}\n').group()#'}'# 实例4:\b匹配单词的开头或结尾。单词结尾由空格或非字母数字字符表示。re.search(r'\bclass\b','no class at all').group() # 完整单词匹配 #'class're.search(r'\bclass\b','one subclass is') # Nonere.search('\bclass\b','no class at all') # Nonere.search('\bclass\b','\b' + 'class' + '\b').group()#'\x08class\x08'
2.贪婪匹配与非贪婪匹配:
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
# *?,+?,??,{m,n}? {n,}? 前面的*,+,?等都是贪婪匹配尽可能匹配,后加?号使其变成惰性匹配#实例1 re.findall(r"a(\d+?)",'a23b') # ['2']re.findall(r"a(\d+)",'a23b') # ['23']re.match('<(.*)>','title
').group() #
title
re.match('<(.*?)>','
title
').group()#
re.match(r'^(\d+)(0*)$', '102300').groups() # 贪婪匹配 #('102300', '')re.match(r'^(\d+?)(0*)$', '102300').groups()# 非贪婪匹配#('1023', '00')# 实例2 - 前后均有限定条件不存在什么贪婪模式。re.findall(r"a(\d+)b",'a3333b') # ['3333']re.findall(r"a(\d+?)b",'a3333b') # ['3333']
3.分支条件:
# 用分枝条件注意各条件顺序。从左到右测试每个条件,满足某分枝不会去再管其它的条件。0\d{2}-\d{8}|0\d{3}-\d{7} #匹配 (如010-12345678) (0376-2233445)\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8} #匹配3位区号的电话号码\d{5}-\d{4}|\d{5} #匹配美国邮编。规则5位数字或用连字号间隔9位数字\d{5}|\d{5}-\d{4} #匹配5位邮编(及9位邮编前5位)
4.模拟scanf
# scanf() 格式标记和正则表达式等效映射。scanf()格式 正则表达式%c .%5c {5}%d [-+]?\d+%e,%E,%f,%g [-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?%i [-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)%o \d?\s)([-+]?(0[oO])?[0-7]+%s \S+%u \d+%x, %X [-+]?(0[xX])?[\dA-Fa-f]+s=r'/usr/sbin/mail - 0 0x16, 4 0o70' re.search(r'(\S+) - (\d?\s)([-+]?(0[xX])?[\dA-Fa-f]+),'r' (\d?\s)([-+]?(0[oO])?[0-7]+)' ,s).group()#'/usr/sbin/mail - 0 0x16, 4 0o70'
5.显示所有特殊的需转义字符和非转义字符
import string,res0='';s1='';d=dict();i=0for v in string.punctuation: if v!=re.escape(v): d[i]=re.escape(v)# 转义正则表达式中具有特殊含义的字符 s0=s0+v i+=1 else: s1=s1+vs0 #需转义的特殊字符: '#$&()*+-.?[\\]^{|}~'s1 #不需转义特殊字符: '!"%\',/:;<=>@_`'d #RE经转义特殊字符: # {0: '\\#',1: '\\$',2: '\\&',3: '\\(',4: '\\)',5: '\\*',6: '\\+',7: '\\-', 8: '\\.',9:'\\?',10: '\\[',11: '\\\\',12: '\\]',13: '\\^',14: '\\{', 15: '\\|',16: '\\}',17: '\\~'}re.findall('\{',r'{') #匹配特殊需转义字符 ['{']re.findall(r'{',r'{') #匹配特殊需转义字符 ['{']re.findall('_',r'_') #匹配特殊不需转义字符['_']
转载地址:http://mfqbf.baihongyu.com/