python 正则表达式操作(re)
正则表达式语法
特殊字符
| 字符 | 解释 |
|---|---|
. |
(点) 匹配除了换行的任意字符。 在 re.DOTALL 模式下,将匹配包括换行符的任意字符。 |
^ |
匹配字符串的开头。 在 re.MULTILINE 模式下,也匹配换行后的首个字符。 |
$ |
匹配字符串尾或者换行符的前一个字符。 在 re.MULTILINE 模式下,匹配换行符的前一个字符。 |
* |
对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 |
+ |
对它前面的正则式匹配1到任意次重复。 |
? |
对它前面的正则式匹配0到1次重复。 |
*?+??? |
* + ? 修饰符都是 贪婪的;它们在字符串进行尽可能多的匹配。在修饰符之后添加 ? 将使样式以 非贪婪 方式方式进行匹配; 尽量 少 的字符将会被匹配。 |
{m} |
对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。 |
{m, n} |
对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。 |
{m,n}? |
前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。 |
\ |
转义特殊字符 (允许你匹配 * ?, 或者此类其他) |
[] |
用于表示一个字符集合。 · 单独列出 例如: [amk] 匹配 a, m 或者 k· 字符范围 通过用 - 将两个字符连起来,例如: [a-z], [0-5]· 特殊字符在集合中,失去它的特殊含义, 例如: [(+*)] 匹配 ( + * ) · 转义 加反斜杠\即可 |
│ |
A│B, A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B. 任意个正则表达式可以用 │ 连接。 |
(...) |
(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。 |
(?…) |
这是个扩展标记法 (一个 ‘?’ 跟随 ‘(‘ 并无含义)。 |
(?abcDEF) |
(a b c D E F 中的一个或多个) 这个组合匹配一个空字符串;这些字符对正则表达式设置以下标记: re.A 只匹配ASCII字符re.I 忽略大小写re.L 语言依赖re.M 多行模式re.S 点dot匹配全部字符re.U Unicode匹配re.X 冗长模式 |
(?:…) |
正则括号的非捕获版本。 匹配在括号内的任何正则表达式,但该分组所匹配的子字符串 不能 在执行匹配后被获取或是之后在模式中被引用。 |
(?abc-def:…) |
( a b c 中的0或者多个, 之后可选跟随 ‘-‘ 在后面跟随 d e f 中的一到多个) |
(?P<name>…) |
( 命名组合)类似正则组合,但是匹配到的子串组在外部是通过定义的 name 来获取的。 |
(?P=name) |
反向引用一个命名组合;它匹配前面那个叫 name 的命名组中匹配到的串同样的字串。 |
(?#…) |
注释;里面的内容会被忽略。 |
(?=…) |
匹配 … 的内容,但是并不消费样式的内容。 |
(?!…) |
匹配 … 不符合的情况。 |
(?<=…) |
匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置。 |
(?<!…) |
匹配当前位置之前不是 … 的样式。 |
(?(id/name)yes-pattern\no-pattern) |
如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern,no-pattern 可选,也可以被忽略。 |
\number |
匹配数字代表的组合。 |
\A |
只匹配字符串开始。 |
\b |
匹配空字符串,但只在单词开始或结尾的位置。 |
\B |
匹配空字符串,但 不 能在词的开头或者结尾。 |
\d |
匹配数字,就是 [0-9] |
\D |
匹配任何非十进制数字的字符。\d 取非 |
\s |
匹配空白字符 [\t\n\r\f\v] |
\S |
匹配任何非空白字符。就是 \s 取非。 |
\w |
匹配数字和字母和下划线,就是 [a-zA-Z0-9_] |
\W |
匹配任何数字和字母和下划线,就是 \w 取非 |
\Z |
只匹配字符串尾。 |
模块内容
导入模块
import re
re.compile(pattern, flags=0)
将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他如下描述。
prog = re.compile(pattern)
result = prog.match(string)
等价于
result = re.match(pattern, string)
如果需要多次使用这个正则表达式的话,使用 re.compile() 和保存这个正则对象以便复用,可以让程序更加高效。
注解 通过 re.compile() 编译后的样式,和模块级的函数会被缓存, 所以少数的正则表达式使用无需考虑编译的问题。
re.A re.ASCII
让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode。
re.DEBUG
显示编译时的debug信息,没有内联标记。
re.I re.IGNORECASE
进行忽略大小写匹配;表达式如 [A-Z] 也会匹配小写字符。
re.L re.LOCALE
由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配。
re.M re.MULTILINE
设置以后,样式字符 ‘^’ 匹配字符串的开始,和每一行的开始(换行符后面紧跟的符号);样式字符 ‘$’ 匹配字符串尾,和每一行的结尾(换行符前面那个符号)。默认情况下,’^’ 匹配字符串头,’$’ 匹配字符串尾。对应内联标记 (?m) 。
re.S re.DOTALL
让 ‘.’ 特殊字符匹配任何字符,包括换行符;如果没有这个标记,’.’ 就匹配 除了 换行符的其他任意字符。对应内联标记 (?s) 。
re.X re.VERBOSE
这个标记允许你编写更具可读性更友好的正则表达式。通过分段和添加注释。空白符号会被忽略,除非在一个字符集合当中或者由反斜杠转义,或者在 *?, (?: or (?P<…> 分组之内。当一个行内有 # 不在字符集和转义序列,那么它之后的所有字符都是注释。
re.search(pattern, string, flags=0)
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。
re.match(pattern, string, flags=0)
如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。
re.fullmatch(pattern, string, flags=0)
如果整个 string 匹配到正则表达式样式,就返回一个相应的 匹配对象 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。
re.split(pattern, string, maxsplit=0, flags=0)
用 pattern 分开 string 。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。
>>> re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split(r'(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split(r'\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']
如果分隔符里有捕获组合,并且匹配到字符串的开始,那么结果将会以一个空字符串开始。对于结尾也是一样
>>> re.split(r'(\W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', '']
这样的话,分隔组将会出现在结果列表中同样的位置。
样式的空匹配将分开字符串,但只在不相临的状况生效。
>>> re.split(r'\b', 'Words, words, words.')
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split(r'\W*', '...words...')
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split(r'(\W*)', '...words...')
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
re.findall(pattern, string, flags=0)
对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。空匹配也会包含在结果里。
re.finditer(pattern, string, flags=0)
pattern 在 string 里所有的非重复匹配,返回为一个迭代器 iterator 保存了 匹配对象 。 string 从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。
re.sub(pattern, repl, string, count=0, flags=0)
返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,\n 会被转换为一个换行符,\r 会被转换为一个回车附,依此类推。 未知的 ASCII 字符转义序列保留在未来使用,会被当作错误来处理。 其他未知转义序列例如 \& 会保持原样。 向后引用像是 \6 会用样式中第 6 组所匹配到的子字符串来替换。 例如:
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
如果 repl 是一个函数,那它会对每个非重复的 pattern 的情况调用。这个函数只能有一个 匹配对象 参数,并返回一个替换后的字符串。比如
>>> def dashrepl(matchobj):
... if matchobj.group(0) == '-': return ' '
... else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'
样式可以是一个字符串或者一个 样式对象 。
可选参数 count 是要替换的最大次数;count 必须是非负整数。如果忽略这个参数,或者设置为0,所有的匹配都会被替换。空匹配只在不相临连续的情况被更替,所以 sub(‘x*’, ‘-‘, ‘abxd’) 返回 ‘-a-b—d-‘ 。
在字符串类型的 repl 参数里,如上所述的转义和向后引用中,\g
re.subn(pattern, repl, string, count=0, flags=0)
行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数).
re.escape(pattern)
转义 pattern 中的特殊字符。如果你想对任意可能包含正则表达式元字符的文本字符串进行匹配,它就是有用的。比如
>>> print(re.escape('python.exe'))
python\.exe
>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
>>> print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+
>>> operators = ['+', '-', '*', '/', '**']
>>> print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*
这个函数不能被用于 sub() 和 subn() 的替换字符串,只有反斜杠应该被转义。 例如:
>>> digits_re = r'\d+'
>>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings'
>>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample))
/usr/sbin/sendmail - \d+ errors, \d+ warnings
re.purge()
清除正则表达式缓存。
exception re.error(msg, pattern=None, pos=None)
raise 一个例外。当传递到函数的字符串不是一个有效正则表达式的时候(比如,包含一个不匹配的括号)或者其他错误在编译时或匹配时产生。如果字符串不包含样式匹配,是不会被视为错误的。错误实例有以下附加属性:
msg未格式化的错误消息。pattern正则表达式样式。pos编译失败的 pattern 的位置索引(可以是 None )。lineno对应 pos (可以是 None) 的行号。colno对应 pos (可以是 None) 的列号。

