Python 标准库:re 模块函数解析

re模块函数概览

  • re.compile(pattern, flags=0)
  • re.search(pattern, string, flags=0)
  • re.match(pattern, string, flags=0)
  • re.split(pattern, string, maxsplit=0, flags=0)
  • re.findall(pattern, string, flags=0)
  • re.finditer(pattern, string, flags=0)
  • re.sub(pattern, repl, string, count=0, flags=0)
  • re.subn(pattern, repl, string, count=0, flags=0)
  • re.escape(string)
  • re.purge()

re.compile()

语法:

re.compile(pattern, flags=0)

编译正则表达式,并返回一个 RE 对象。可以使用该对象的 match()search() 方法来匹配字符串。

示例:

prog = re.compile(pattern)
result = prog.match(string)

与下列写法等价:

result = re.match(pattern, string)

表达式被编译成 RE 对象后,可被多次使用。如果是多次使用同一个表达式来匹配字符串的话,那么提前编译表达式可以提高匹配效率,加快匹配速度。

指定 flags 的值可以改变表达式的行为,它的取值将在下面列出。如果要同时指定多个值,可使用位或运算符 | 来分隔。

  • re.DEBUG :显示有关表达式编译的调试信息。
  • re.I re.IGNORECASE :忽略大小写差别。
  • re.L re.LOCALE :特殊字符 \w, \W, \b, \B, \s, \S 将取决于当前环境。
  • re.M re.MULTILINE :令字符 ^$ 匹配多行(如果存在空行的话)。
  • re.S re.DOTALL :令字符 . 匹配包括换行符在内的任意字符。
  • re.U re.UNICODE :特殊字符 \w, \W, \b, \B, \d, \D, \s, \S 将取决于Unicode字符属性。
  • re.X re.VERBOSE :用于编写更易阅读的表达式,自动忽略普通空格。

re.search()

语法:

re.search(pattern, string, flags=0)

仅匹配第一个满足条件的字符串,如果匹配成功则返回一个 MatchObject 对象,否则返回 None

re.match()

语法:

re.match(pattern, string, flags=0)

仅匹配字符串的起始位置子串,如果匹配成功则返回一个 MatchObject 对象,否则返回 None

注意:即使是在 MULTILINE 模式下,re.match()也只会匹配整个字符串的起始位置,而不会匹配每一行的起始位置。

如果你想要匹配字符串的任意位置,请使用 search() 方法。

re.split()

语法:

re.split(pattern, string, maxsplit=0, flags=0)

通过匹配表达式来切割字符串。正常情况下,表达式匹配的结果仅用于分割字符串,不会添加到结果列表中。如果表达式带有捕获分组括号,则表达式匹配到的结果也将被添加到结果列表中。

如果指定了 maxsplit 的值,且不为0,那么最多进行 maxsplit 次的字符串切割操作。最后剩下的未被切割的字符串,将作为一个整体添加到结果列表中。这种情况下,结果列表最多会有 maxsplit + 1 项。

re.findall()

语法:

re.findall(pattern, string, flags=0)

以列表的形式返回所有不重叠的匹配结果。由于扫描过程是至左向右进行,因此匹配结果在列表中的顺序与扫描到的顺序一致。需要注意的是,空匹配结果同样会被添加到列表中。

如果表达式中含有捕获分组,那么表达式匹配到的结果中,只有捕获分组里的内容会被添加到结果列表中。

例如:

>>> re.findall(r'(\w)\d', 'a1 b2 c3 d4')
['a', 'b', 'c', 'd']

如果表达式含有多个捕获分组,那么对于每一个表达式匹配到的结果,都将以元组的形式添加到列表中。元组中的每个元素,依次对应表达式中的一个捕获分组。

例如:

>>> re.findall(r'(\w)(\d)', 'a1 b2 c3 d4')
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]

re.finditer()

语法:

re.finditer(pattern, string, flags=0)

返回一个迭代器,包含所有不重叠的匹配结果,用于生成 MatchObject 对象。

匹配结果的迭代顺序与从左至右扫描到的顺序一致,空匹配结果同样会被添加到列表中。

re.sub()

语法:

re.sub(pattern, repl, string, count=0, flags=0)

返回一个被替换后的字符串。替换过程:找到字符串中所有与表达式相匹配的结果,每个结果根据给定的 repl 进行替换。

其中:
pattern 可以是字符串,或编译后的 RE 对象。
repl 可以是字符串,或一个函数。

如果 repl 为字符串,则所有以反斜杠 \ 开头的特殊转义字符将会被预先处理。例如: \n \r \t 等字符,会被转换为它们对应的换行、回车、制表符。而未知的转义字符,如 \j 则不会被处理。反向引用,例如 \2 ,会被替换为匹配结果中的第二个捕获分组的内容。

例如:

>>> text = 'a1 b2 c3'
>>> re.sub(r'(\w)(\d)', r'\2\1', text)
'1a 2b 3c'

如果 repl 为函数,则它会在每一次匹配成功时被调用。函数的参数是一个 MatchObject 对象,返回值是替换后的字符串。

例如:

>>> def foo(matchobj):
...     if matchobj.group(0) == '-': return '+'
...     else: return '*'
>>> re.sub(r'\D', foo, '1-2/4')
'1+2*4'

可选参数 count 可用于指定最多匹配次数,如果不指定,或指定的值为0,将会替换所有匹配结果。

re.subn()

语法:

re.subn(pattern, repl, string, count=0, flags=0)

re.sub() 替换过程相同,不同的是该函数的返回值是一个二元组,包含替换后的字符串和替换操作的次数。

即:(new_string, times_of_subtitution)

re.escape()

语法:

re.escape(string)

返回经过处理后的字符串。处理过程:对于原字符串中除字母和数字以外的所有字符,在其前面添加反斜杠 \

当你想要对含有正则表达式特殊符号的字符串进行匹配时,这个函数将会派上用场。

例如:

>>> re.findall(re.escape(r'\1\2'), r'\1\2\3')
['\\1\\2']

re.purge()

语法:

re.purge()

清除正则表达式缓存。

参考文档:re -- Regular expression operations

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注