十、通配字符:.(句点)字符称为“通配符”,它匹配除换行之外的所有字符,一次只会匹配一个字符。
>>> 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)
1
、
2
、
3……
的文本”。例如:如果想要隐去密探的姓名,只显示他们姓名的第一个字母,你可以使用正则表达式
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)