Python的re模块 --- 正则表达式操作(二)

简介: Python的re模块 --- 正则表达式操作(二)

模块内容



模块定义了几个函数,常量,和一个例外。有些函数是编译后的正则表达式方法的简化版本(少了一些特性)。绝大部分重要的应用,总是会先将正则表达式编译,之后在进行操作。


在 3.6 版更改: 标志常量现在是 RegexFlag 类的实例,这个类是 enum.IntFlag 的子类。


re.compile(pattern, flags=0)


将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法match(), search() 以及其他如下描述。


这个表达式的行为可以通过指定 标记 的值来改变。值可以是以下任意变量,可以通过位的OR操作来结合( |操作符)。


序列


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。这只对Unicode样式有效,会被byte样式忽略。相当于前面语法中的内联标志 (?a) 。


注意,为了保持向后兼容, re.U 标记依然存在(还有他的同义 re.UNICODE 和嵌入形式 (?u) ) , 但是这些在 Python 3 是冗余的,因为默认字符串已经是Unicode了(并且Unicode匹配不允许byte出现)。


re.DEBUG


显示编译时的debug信息,没有内联标记。


re.I
re.IGNORECASE


进行忽略大小写匹配;表达式如 [A-Z] 也会匹配小写字符。Unicode匹配(比如 Ü 匹配 ü)同样有用,除非设置了 re.ASCII 标记来禁用非ASCII匹配。当前语言区域不会改变这个标记,除非设置了 re.LOCALE 标记。这个相当于内联标记 (?i) 。


注意,当设置了 IGNORECASE 标记,搜索Unicode样式 [a-z] 或 [A-Z] 的结合时,它将会匹配52个ASCII字符和4个额外的非ASCII字符: 'İ' (U+0130, 拉丁大写的 I 带个点在上面), 'ı' (U+0131, 拉丁小写没有点的 I ), 'ſ' (U+017F, 拉丁小写长 s) and 'K' (U+212A, 开尔文符号).如果使用 ASCII 标记,就只匹配 'a' 到 'z' 和 'A' 到 'Z' 。


re.L
re.LOCALE


由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配。这个标记只能对byte样式有效。这个标记不推荐使用,因为语言区域机制很不可靠,它一次只能处理一个 "习惯”,而且只对8位字节有效。Unicode匹配在Python 3 里默认启用,并可以处理不同语言。 这个对应内联标记 (?L) 。


在 3.6 版更改: re.LOCALE 只能用于byte样式,而且不能和 re.ASCII 一起用。


在 3.7 版更改: 设置了 re.LOCALE 标记的编译正则对象不再在编译时依赖语言区域设置。语言区域设置只在匹配的时候影响其结果。


re.M
re.MULTILINE


设置以后,样式字符 '^' 匹配字符串的开始,和每一行的开始(换行符后面紧跟的符号);样式字符 '$' 匹配字符串尾,和每一行的结尾(换行符前面那个符号)。默认情况下,’^’ 匹配字符串头,'$' 匹配字符串尾。对应内联标记 (?m) 。


re.S
re.DOTALL


让 '.' 特殊字符匹配任何字符,包括换行符;如果没有这个标记,'.' 就匹配 除了 换行符的其他任意字符。对应内联标记 (?s) 。


re.X
re.VERBOSE


这个标记允许你编写更具可读性更友好的正则表达式。通过分段和添加注释。空白符号会被忽略,除非在一个字符集合当中或者由反斜杠转义,或者在 *?, (?: or (?P<…> 分组之内。当一个行内有 # 不在字符集和转义序列,那么它之后的所有字符都是注释。


意思就是下面两个正则表达式等价地匹配一个十进制数字:


a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")


对应内联标记 (?x) 。


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


扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None; 注意这和找到一个零长度匹配是不同的。


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


如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。


注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。


如果你想定位 string 的任何位置,使用 search() 来替代(也可参考 search() vs. match() )


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


如果整个 string 匹配到正则表达式样式,就返回一个相应的 匹配对象 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。


3.4 新版功能.



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', '...', '', '', '']


在 3.1 版更改: 增加了可选标记参数。


在 3.7 版更改: 增加了空字符串的样式分隔。


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


对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。空匹配也会包含在结果里。


在 3.7 版更改: 非空匹配现在可以在前一个空匹配之后出现了。


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


pattern 在 string 里所有的非重复匹配,返回为一个迭代器 iterator 保存了 匹配对象 。 string 从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。


在 3.7 版更改: 非空匹配现在可以在前一个空匹配之后出现了。


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 会使用命名组合 name,(在 (?P…) 语法中定义) \g 会使用数字组;\g<2> 就是 \2,但它避免了二义性,如 \g<2>0。 \20就会被解释为组20,而不是组2后面跟随一个字符 '0'。向后引用 \g<0> 把 pattern 作为一整个组进行引用。


在 3.1 版更改: 增加了可选标记参数。


在 3.5 版更改: 不匹配的组合替换为空字符串。


在 3.6 版更改: pattern 中的未知转义(由 '\' 和一个 ASCII 字符组成)被视为错误。


在 3.7 版更改: repl 中的未知转义(由 '\' 和一个 ASCII 字符组成)被视为错误。


样式中的空匹配相邻接时会被替换。


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


行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数).


在 3.1 版更改: 增加了可选标记参数。


在 3.5 版更改: 不匹配的组合替换为空字符串。


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


在 3.3 版更改: '_' 不再被转义。


在 3.7 版更改: 只有在正则表达式中可以产生特殊含义的字符会被转义。


re.purge()


清除正则表达式缓存。


exception re.error(msg, pattern=None, pos=None)


raise 一个例外。当传递到函数的字符串不是一个有效正则表达式的时候(比如,包含一个不匹配的括号)或者其他错误在编译时或匹配时产生。如果字符串不包含样式匹配,是不会被视为错误的。错误实例有以下附加属性:


msg


未格式化的错误消息。


pattern


正则表达式样式。


pos


编译失败的 pattern 的位置索引(可以是 None )。


lineno


对应 pos (可以是 None) 的行号。


colno


对应 pos (可以是 None) 的列号。


在 3.5 版更改: 添加了附加属性。


目录
相关文章
|
1天前
|
Python
python常见操作10例
python常见操作10例
11 2
|
3天前
|
安全 调度 Python
什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?
【2月更文挑战第4天】【2月更文挑战第9篇】什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?
|
5天前
|
Java Python
使用Python的concurrent.futures模块简化多线程与多进程编程
使用Python的concurrent.futures模块简化多线程与多进程编程
|
5天前
|
并行计算 程序员 API
Python多进程编程:利用multiprocessing模块实现并行计算
Python多进程编程:利用multiprocessing模块实现并行计算
|
5天前
|
开发者 Python
Python中的正则表达式:re模块详解与实例
Python中的正则表达式:re模块详解与实例
|
5天前
|
JSON 数据库 数据格式
Python标准库中的常用模块介绍与使用技巧
Python标准库中的常用模块介绍与使用技巧
|
5天前
|
数据格式 Python
Python中的正则表达式:基础与应用
Python中的正则表达式:基础与应用
|
5天前
|
存储 数据处理 Python
文件I/O操作在Python中的实现与技巧
文件I/O操作在Python中的实现与技巧
|
10天前
|
大数据 程序员 Python
Python中的异步编程:使用asyncio库实现高效IO操作
传统的同步编程模式在处理IO密集型任务时效率较低,因此异步编程成为了解决这一问题的关键。本文将介绍如何利用Python中的asyncio库实现异步编程,以及如何利用异步特性提高IO操作的效率,让你的程序更加响应迅速。
|
20天前
|
JSON JavaScript 前端开发
Python之JavaScript逆向系列——接口JSON信息获取与操作
Python之JavaScript逆向系列——接口JSON信息获取与操作
34 0

相关产品

  • 云迁移中心