Python学习(正则表达式与模式匹配下篇)

来源:互联网 发布:海洛因在淘宝的名称 编辑:程序博客网 时间:2024/06/07 05:38

十、通配字符:.(句点)字符称为“通配符”,它匹配除换行之外的所有字符,一次只会匹配一个字符。

>>> nums = re.compile(r'20.')>>> num = nums.findall('2017 2018 2019')>>> num['201', '201', '201']>>> nums = re.compile(r'20..')>>> num = nums.findall('2017 2018 2019')>>> num['2017', '2018', '2019']

十一、用点和星匹配所有字符:点不能唯一不能匹配换行符,可以在compile()中再加一个参数。

>>> somes = re.compile(r'.*',re.DOTALL)>>> some = somes.search('dsauygfisaf65s4df64s65')>>> some.group()'dsauygfisaf65s4df64s65'

十二、不区分大小写的匹配 :添加re.I参数。

>>> chars = re.compile('CsDn')>>> char = chars.search('CSDN cSDN CsDn')>>> char.group()'CsDn'
>>> chars = re.compile('CsDn',re.I)>>> char = chars.search('CSDN cSDN')>>> char.group()'CSDN'

十三、用sub()方法替换字符串:sub()需传入两个参数,第一个参数是用来替换的字符串,用于取代发现的匹配。第二个参数是一个字符串,即正则表达式要匹配的文本。

>>> import re>>> name = re.compile(r'\w+')>>> name.sub('Lee','Tony')'Lee'
有时候,你可能需要使用匹配的文本本身作为替换的一部分。在sub()的第一个参数中,可以输入\1\2\3……来表示“在替换中输入分组(\w)123……的文本”。例如:如果想要隐去密探的姓名,只显示他们姓名的第一个字母,你可以使用正则表达式Agent(\w)\w*,传入r'\1****'作为sub()的第一个参数。字符串中的\1将由分组1匹配的文本所替代,也就是正则表达式的(\w)分组,一次类推,查找所有相匹配的文本做替换。

>>> agentNamesRegex = re.compile(r'Agent (\w)\w*')>>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.')'A**** told C**** that E**** knew B**** was a double agent.'
十四、管理复杂的正则表达式:

如果正则是这样的:phoneRegex = re.compile(r'((\d{3(\s*(ext|x|ext.)\s*\d{2,5})?)'),将会不利于识别,我们可以用添加re.VERBOSE参数给它进行分开注释,#符号和它后面直到行末的内容都会被忽略。而且表示正则表达式的多行字符串中,多余的空白字符也不认为是要匹配的文本模式的一部分。

>>> phoneRegex = re.compile(r'''(    (\d{3}|\(\d{3}\))?              # area code    (\s|-|\.)?                      # separator    \d{3}                           # first 3 digits    (\s|-|\.)                       # separator    \d{4}                           # last 4 digits    (\s*(ext|x|ext.)\s*\d{2,5})?    # extension    )''', re.VERBOSE)
compile()只能接受一个值作为它的第二参数,如果想做多种判断,比如前面说的忽略大小写字母,可以使用管道字符(|来分割判断条件,满足多种需求。

>>> someRegexValue = re.compile('foo', re.IGNORECASE | re.DOTALL | re.VERBOSE)

原创粉丝点击