匹配所有的字符(包括换行符)
.* 可以匹配除换行符以外的所有字符,通过传入 re.DOTALL 参数作为re.compile()的第二个参数,可以让句点字符匹配所有的字符,包括换行符
import re noNewLineRegex1 = re.compile('.*') print(noNewLineRegex1.search('Serve the public trust.\nProtect the innocnet.').group()) 输出: Serve the public trust. noNewLineRegex2 = re.compile('.*',re.DOTALL) print(noNewLineRegex2.search('Serve the public trust.\nProtect the innocnet.').group()) 输出: Serve the public trust. Protect the innocnet.
不区分大小写的匹配
通常正则表达式用你指定的大小写匹配文本,例如,下面的正则表达式匹配完全不同的字符串
regex1 = re.compile('RoboCop') regex2 = re.compile('roBoCop') regex3 = re.compile('RoBocop')
但是有时候你只关心匹配字母,不关心它们是大写还是小写,要让正则表达式不区分大小写,可以向re.compile()传入 re.IGNORECASE 或者简单的 re.I ,作为第二个参数来忽略大小写:
regex1 = re.compile('RoboCop',re.I) regex2 = re.compile('roBoCop',re.IGNORECASE) print(regex1.search('ROBOCOP').group()) print(regex2.search('ROBOCOP').group()) 输出: ROBOCOP ROBOCOP
管理复杂的正则表达式
如果要匹配的正则表达式很简单,正则表达式就很好,但匹配复杂的文本模式,可能需要长的,费解的正则表达式,你可以告诉re.compile(),忽略正则表达式字符串中的空白符和注释,从而缓解这一点,要实现这种详细模式,可以向re.compile()传入变量 re.VERBOSE,作为第二个参数:
现在,不必使用这样难以阅读的正则表达式:
phoneRegex = re.compile(r'((\d{3}|\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})? )') print(phoneRegex.search('123-123-1234').group())
可以将正则表达式放在多行中,并加上注释,像下面这样:
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) print(phoneRegex.search('123-123-1234').group()) 输出: 123-123-1234
注意:
上面的举例使用了三重引号('''),创建了一个多行字符串,这样就可以将正则表达式定义放在多行中,让它更具可读性。
组合使用re.IGNORECASE , re.VERBOSE , re.DOTALL
如果想要在正则表达式中使用re.VERBOSE 来编写注释,还希望使用re.IGNORECASE来忽略大小写,该怎么办,遗憾的是re.compile()函数只接受一个值作为它的第二个参数,可以使用管道符(|)将变量组合起来,从而绕过这个限制。管道符在这里称为 “按位或” 操作符。
所以,如果希望正则表达式不区分大小写,并且句点字符匹配换行,就可以这样构造re.compile()调用:
someRegexValue = re.compile('''foo ''',re.DOTALL | re.IGNORECASE | re.VERBOSE) print(someRegexValue.findall('FOO\nfoO')) 输出: FOO foO