Python正则表达式有两种使用方式,一种是直接调用类方法,另一种是先根据pattern编译一个re对象,再调用这个对象的方法。一般来说第一种就够了,但第二种可以提供的功能更多。两种方法示例如下:

import re

p = '\d\d\d'
s = 'abc123def'

# Method 1
re.search(p,s)

# Method 2
o = re.compile(p)
o.search(s)

然后需要记忆一些常用的正则表达式:

.
^
$
*
+
?
*?
+?
??
{m}
{m,n}
{m,n}?
\
[]
|
(...)
(?P<name>...)
(?P=name)
(?=...)
(?!...)
(?<=...)
(?<!...)
\number
\b
\B
\d
\D
\s
\S
\w
\W

具体说明在第一个置底链接页面里。

re模块有一些常用方法如下:

  • search - s中对p的第一个匹配
  • match - 同search,但必须从s的开始位置匹配
  • findall - 返回一个list,包含s中所有匹配p的字符串
  • finditer - 返回一个iterator,包含s中所有对p的匹配
  • sub - 正则替换
  • split - 以s中匹配p的字符串作为分隔符,分割s

match object有一些常用方法如下:

  • group - 返回指定分组
  • groups - 返回一个list,包含所有大于0的分组
  • groupdict - 返回一个dict,包含所有命名分组
  • start - 返回指定分组的起始位置
  • end - 返回指定分组的结束位置
  • span - 返回一个2-tuple,包含指定分组的起始位置和结束位置,即(start,end)

Tips:

  • finditer比findall更强大,因为finditer得到的是一串match object,可以得到各个匹配的位置信息等等。而findall得到的只是对应匹配的字符串。
  • sub的repl参数会自动转换\n什么的,无论是写成’\n’,’\\n’还是r’\n’。如果真要替换为字面意义的\n,必须写成r’\\n’。我个人觉得这是个bug。
  • groups只返回大于0的分组,所以整个匹配,即group(0),不会被包含在groups()的结果中。
  • split的参数p如果被()包围,则匹配p的部分(即分隔符)也会被包含在结果中。
  • start和end符合左闭右开。

Links: