此模块提供与Perl中类似的正则表达式匹配操作。
要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(字节)。但是,Unicode字符串和8位字符串不能混合:也就是说,不能将Unicode字符串与字节模式匹配,反之亦然;类似地,当请求替换时,替换字符串必须与模式和搜索字符串的类型相同。
正则表达式使用反斜杠字符('\')来表示特殊形式,或者允许在不调用特殊含义的情况下使用特殊字符。这与Python在字符串文本中使用相同的字符来实现相同的目的相冲突;例如,要匹配文本反斜杠,可能必须将“\\\\\”写入模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须在正则Python字符串文本中表示为\\。另外,请注意Python在字符串文本中使用反斜杠的任何无效转义序列现在都会生成一个DeprecationWarning,将来它将成为一个SyntaxError。即使它是正则表达式的有效转义序列,也会发生这种行为。
解决方案是将Python的原始字符串表示法用于正则表达式模式;在前缀为“r”的字符串文本中,反斜杠不会以任何特殊方式处理。所以r“\n”是一个包含“\”和“n”的双字符字符串,而“\n”是一个包含换行符的单字符字符串。通常,模式将使用这个原始字符串表示法在Python代码中表示。
需要注意的是,大多数正则表达式操作都可以作为模块级函数和已编译正则表达式的方法使用。这些函数是快捷方式,不需要您首先编译regex对象,但会丢失一些微调参数。
第三方regex模块,它有一个与标准库re模块兼容的API,但是提供了额外的功能和更全面的Unicode支持。
>>> import re >>> dir(re) ['A', 'ASCII', 'DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'Match', 'Pattern', 'RegexFlag', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_cache', '_compile', '_compile_repl', '_expand', '_locale', '_pickle', '_special_chars_map', '_subx', 'compile', 'copyreg', 'enum', 'error', 'escape', 'findall', 'finditer', 'fullmatch', 'functools', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'template'] >>> re.__all__ ['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'Pattern', 'Match', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
查找匹配函数实例
re.search() 查找第一个匹配串
原型:re.search(pattern, string, flags)
第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None;
第二个参数表示要匹配的字符串;
第三个参数是匹配方式标记。
>>> import re >>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba' >>> str1='Python' >>> r=re.search(str1,strL) >>> r <re.Match object; span=(9, 15), match='Python'> >>> r.span() (9, 15) >>> strL[9:15]==str1 True >>>
re.match() 从串首开始匹配到第一个匹配串
原型:re.match(pattern, string, flags) 参数说明与search()的相同
>>> import re >>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba' >>> r=re.match(str1,strL) >>> r >>> str2='1.Java' >>> r=re.match(str2,strL) >>> r <re.Match object; span=(0, 6), match='1:Java'> >>> r.span() (0, 6) >>> r.span()[0]==0 True >>> strL[0:6]==str2 True >>>
search()和match() 的区别
后者只从字串的第一个字符开始匹配,即它的非None返回值的span()[0]恒等于0。
>>> help(re.match) Help on function match in module re: match(pattern, string, flags=0) Try to apply the pattern at the start of the string, returning a Match object, or None if no match was found. >>> help(re.search) Help on function search in module re: search(pattern, string, flags=0) Scan through string looking for a match to the pattern, returning a Match object, or None if no match was found.
re.Match类、方法
.span().group() .groups() ...
class Match(builtins.object) The result of re.match() and re.search(). Match objects always have a boolean value of True. Methods defined here: span(self, group=0, /) For match object m, return the 2-tuple (m.start(group), m.end(group)). group(...) group([group1, ...]) -> str or tuple. Return subgroup(s) of the match by indices or names. For 0 returns the entire match. groups(self, /, default=None) Return a tuple containing all the subgroups of the match, from 1. default Is used for groups that did not participate in the match. ...... ......
实例:
>>> import re >>> from urllib import request >>> data=request.urlopen("http://www.baidu.com/").read().decode() >>> pat=r'<title>(.*?)</title>' >>> result=re.search(pat,data) >>> result <re.Match object; span=(940, 964), match='<title>百度一下,你就知道</title>'> result.span() (940, 964) >>> result.group() '<title>百度一下,你就知道</title>' >>> result.groups() ('百度一下,你就知道',)
flags 匹配方式标记参数
用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
A ASCII 对于字符串模式,使\w、\w、\b、\b、\d、\d匹配相应的ASCII字符类别(而不是整个Unicode类别,这是默认设置)。
I IGNORECASE 对于字节模式,此标志是唯一可用的行为,无需指定。
L LOCALE 执行不区分大小写的匹配。
M MULTILINE 使\w、\w、\b、\b依赖于当前区域设置。
“^”匹配行的开头(换行后)以及字符串。
“$”匹配行的结尾(在换行之前)以及字符串的结尾。
S DOTALL “.”完全匹配任何字符,包括换行符。
X VERBOSE 忽略空白和注释以获得更好看的RE。
U UNICODE 仅用于兼容性。忽略字符串模式(这是默认值),禁止字节模式
注:每个标记参数都有一个全称和一个单个字母的简称: re.A==re.ASCII,
re.I==re.IGNORECASE,...;且A、 L和U是互斥的。除purge和escape之外的每个函数都可以采用可选的“flags”参数由以上一个或多个模块常数组成,并用“|”连接。
flags参数实例:
>>> import re >>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba' >>> str3='1:java' >>> r=re.match(str3,strL) >>> r >>> #默认标记为re.A区分大小写,所以匹配不到返回None >>> r=re.match(str3,strL,re.I) >>> r <re.Match object; span=(0, 6), match='1:Java'> >>> #第三个参数使用re.I标记,就能忽略大小写进行匹配
问题引入:
以上实例中都是查找或匹配单个字串,这种任务字符串本身就有操作函数,如:strL.find('Python')。
如果要找一类符合某个特征的子串,字符串方法.find()就力不从心了,要用其他代码辅助才能实现。
一个简单的类比,就如文件中可以用通用符*和?一样,dir A*.txt 列出A字母开头的所有文本文件。
问题一:列出字符串strL中的数字
未完待续。。。持续更新中...