正则表达式工具 |
grep |
PowerGREP |
RegexBuddy |
RegexMagic |
通用应用程序 |
EditPad Lite |
EditPad Pro |
语言和库 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
数据库 |
MySQL |
Oracle |
PostgreSQL |
本网站上的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式示例 |
正则表达式参考 |
替换字符串参考 |
书评 |
可打印 PDF |
关于本网站 |
RSS Feed 和博客 |
Python 是一种高级开源脚本语言。Python 的内置“re”模块为 正则表达式 提供了出色的支持,具有现代且完整的正则表达式风格。Python 3.11 中添加了两个重要的缺失功能,原子分组 和 独占量词。虽然 Python 的正则表达式引擎可以正确处理 Unicode 字符串,但其语法仍然缺少 Unicode 属性,并且 简写字符类 仅匹配 ASCII 字符。
首先要做的就是使用 import re 将正则表达式模块导入脚本。
调用 re.search(regex, subject) 将正则表达式模式应用于目标字符串。如果匹配尝试失败,该函数返回 None,否则返回 Match 对象。由于 None 等于 False,因此可以在 if 语句中轻松使用 re.search()。 Match 对象存储有关正则表达式模式匹配的字符串部分的详细信息。
你可以通过将特殊常量指定为 re.search() 的第三个参数来设置 正则表达式匹配模式。 re.I 或 re.IGNORECASE 不区分大小写地应用模式。 re.S 或 re.DOTALL 使 点匹配换行符。 re.M 或 re.MULTILINE 使 插入符号和美元符号 在目标字符串中的换行符后和前匹配。单字母选项和描述性选项之间没有区别,除了键入的字符数。要指定多个选项,请使用 | 运算符将它们“或”在一起:re.search("^a", "abc", re.I | re.M)。
默认情况下,Python 的正则表达式引擎仅将字母 A 到 Z、数字 0 到 9 和下划线视为“单词字符”。指定标志 re.L 或 re.LOCALE 以使 \w 匹配当前区域设置中视为字母的所有字符。或者,你可以指定 re.U 或 re.UNICODE 以将所有脚本中的所有字母视为单词字符。此设置还会影响单词边界。
不要将 re.search() 与 re.match() 混淆。这两个函数执行完全相同的操作,但重要的区别在于 re.search() 将在整个字符串中尝试模式,直到找到匹配项。另一方面,re.match() 仅在字符串的开头尝试模式。基本上,re.match("regex", subject) 与 re.search("\Aregex", subject) 相同。请注意,re.match() 不要求 正则表达式与整个字符串匹配。re.match("a", "ab") 将成功。
Python 3.4 添加了一个新的 re.fullmatch() 函数。仅当正则表达式完全匹配字符串时,此函数才会返回 Match 对象。否则,它将返回 None。 re.fullmatch("regex", subject) 与 re.search("\Aregex\Z", subject) 相同。这对于验证用户输入非常有用。如果 subject 是一个空字符串,则对于任何可以找到零长度匹配项的正则表达式,fullmatch() 的值为 True。
要从字符串中获取所有匹配项,请调用 re.findall(regex, subject)。这将返回字符串中所有不重叠的正则表达式匹配项的数组。“不重叠”表示从左到右搜索字符串,并且下一个匹配尝试从前一个匹配项之后开始。如果正则表达式包含一个或多个捕获组,re.findall() 将返回一个元组数组,每个元组包含由所有捕获组匹配的文本。除非将整个正则表达式放在捕获组中,否则不会在元组中包含整体正则表达式匹配项。
比 re.findall() 更有效的是 re.finditer(regex, subject)。它返回一个迭代器,使你能够遍历主题字符串中的正则表达式匹配项:for m in re.finditer(regex, subject)。for 循环变量 m 是一个 Match 对象,其中包含当前匹配项的详细信息。
与 re.search() 和 re.match() 不同,re.findall() 和 re.finditer() 不支持带有正则表达式匹配标志的可选第三个参数。相反,您可以在正则表达式的开头使用 全局模式修饰符。例如,“(?i)regex”不区分大小写地匹配 regex。
反斜杠是正则表达式中的 元字符。它用于转义其他元字符。正则表达式 \\ 匹配单个反斜杠。 \d 是匹配数字的 单个标记。
Python 字符串也使用反斜杠来转义字符。上述正则表达式被写成 Python 字符串,如 "\\\\" 和 "\\d"。确实令人困惑。
幸运的是,Python 还具有“原始字符串”,它不对反斜杠应用特殊处理。作为原始字符串,上述正则表达式变为 r"\\" 和 r"\d"。使用原始字符串的唯一限制是您用于字符串的分隔符不能出现在正则表达式中,因为原始字符串不提供转义它的方法。
您可以在原始字符串中使用 \n 和 \t。虽然原始字符串不支持这些转义,但正则表达式引擎支持。最终结果是一样的。
在 Python 3.3 之前,Python 的 re 模块不支持任何 Unicode 正则表达式标记。但是,Python Unicode 字符串始终支持 \uFFFF 表示法。Python 的 re 模块可以使用 Unicode 字符串。因此,您可以将 Unicode 字符串 u"\u00E0\\d" 传递给 re 模块,以匹配 à 后跟一个数字。\d 的反斜杠已被转义,而 \u 的反斜杠则没有。这是因为 \d 是正则表达式标记,而正则表达式反斜杠需要转义。 \u00E0 是不应转义的 Python 字符串标记。正则表达式引擎将字符串 u"\u00E0\\d" 视为 à\d。
如果您在 \u 前面再放一个反斜杠,正则表达式引擎将看到 \u00E0\d。如果您将此正则表达式与 Python 3.2 或更早版本一起使用,它将匹配文字 u00E0 后跟一个数字。
为了避免对反斜杠是否需要转义产生任何混淆,只需使用 Unicode 原始字符串,如 ur"\u00E0\d"。然后反斜杠不需要转义。Python 确实会在原始字符串中解释 Unicode 转义。
在 Python 3.0 及更高版本中,字符串默认是 Unicode。因此,上述示例中显示的 u 前缀不再是必需的。Python 3.3 还为正则表达式引擎添加了对 \uFFFF 表示法的支持。因此,在 Python 3.3 中,您可以使用字符串 "\\u00E0\\d" 来传递正则表达式 \u00E0\d,它将匹配类似 à0 的内容。
re.sub(regex, replacement, subject) 在 subject 中执行查找并替换操作,用 replacement 替换 subject 中 regex 的所有匹配项。sub() 函数会返回结果。你传递的 subject 字符串不会被修改。
如果 regex 有 捕获组,则可以使用捕获组中 regex 部分匹配的文本。若要替换第三组的文本,请在替换字符串中插入 \3。如果你想使用第三组的文本后跟一个字面值 3 作为替换,请使用 \g<3>3。\33 被解释为第 33 组。如果组数少于 33,则会出错。如果你使用了 命名捕获组,则可以使用 \g<name> 在替换文本中使用它们。
re.sub() 函数对替换文本应用与正则表达式相同的反斜杠逻辑。因此,你应该对替换文本使用原始字符串,就像我在上面的示例中所做的那样。re.sub() 函数还将在原始字符串中解释 \n 和 \t。如果你希望 c:\temp 作为替换,请使用 r"c:\\temp" 或 "c:\\\\temp"。第 3 个反向引用是 r"\3" 或 "\\3"。
re.split(regex, subject) 返回一个字符串数组。该数组包含 subject 中所有 regex 匹配项之间的部分。相邻的 regex 匹配项会导致数组中出现空字符串。regex 匹配项本身不包含在数组中。如果 regex 包含 捕获组,则捕获组匹配的文本将包含在数组中。捕获组被插入到出现在 regex 匹配项左侧和右侧的子字符串之间。如果你不希望数组中出现捕获组,请将它们转换为 非捕获组。re.split() 函数不提供抑制捕获组的选项。
你可以指定一个可选的第三个参数来限制 subject 字符串被拆分的次数。请注意,此限制控制拆分的次数,而不是最终出现在数组中的字符串数。subject 的未拆分剩余部分将作为最终字符串添加到数组中。如果没有捕获组,则数组将包含 limit+1 个项目。
re.split() 的行为在 Python 版本之间发生了变化,当正则表达式可以找到零长度匹配项时。在 Python 3.4 及更早版本中,re.split() 忽略零长度匹配项。在 Python 3.5 和 3.6 中,re.split() 在遇到零长度匹配项时会抛出 FutureWarning。此警告表示 Python 3.7 中的变化。现在 re.split() 也会在零长度匹配项上进行拆分。
re.search() 和 re.match() 返回 Match 对象,而 re.finditer() 生成一个迭代器以遍历 Match 对象。此对象包含有关正则表达式匹配的许多有用信息。我将在下面的讨论中使用 m 来表示 Match 对象。
m.group() 返回与整个正则表达式匹配的字符串部分。 m.start() 返回匹配开始处的字符串偏移量。 m.end() 返回匹配之外的字符偏移量。 m.span() 返回 m.start() 和 m.end() 的 2 元组。您可以使用 m.start() 和 m.end() 来切片主题字符串:subject[m.start():m.end()]。
如果您想要捕获组的结果而不是整体正则表达式匹配,请将组的名称或编号指定为参数。 m.group(3) 返回由第三个 捕获组 匹配的文本。 m.group('groupname') 返回由 命名组 'groupname' 匹配的文本。如果该组未参与整体匹配,则 m.group() 返回空字符串,而 m.start() 和 m.end() 返回 -1。
如果您想执行基于正则表达式的搜索和替换而不使用 re.sub(),请调用 m.expand(replacement) 来计算替换文本。该函数返回替换字符串,其中反向引用等已被替换。
如果您想多次使用相同的正则表达式,您应该将其编译成正则表达式对象。正则表达式对象更有效率,并且让您的代码更易读。要创建一个,只需调用 re.compile(regex) 或 re.compile(regex, flags)。flags 是上面针对 re.search() 和 re.match() 函数描述的匹配选项。
由 re.compile() 返回的正则表达式对象提供了 re 模块也直接提供的全部函数:search()、match()、findall()、finditer()、sub() 和 split()。区别在于它们使用存储在 regex 对象中的模式,并且不将 regex 作为第一个参数。 re.compile(regex).search(subject) 等效于 re.search(regex, subject)。
| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |
| grep | PowerGREP | RegexBuddy | RegexMagic |
| EditPad Lite | EditPad Pro |
| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML 模式 | Xojo | XQuery 和 XPath | XRegExp |
| MySQL | Oracle | PostgreSQL |
页面 URL:https://regexper.cn/python.html
页面上次更新:2023 年 3 月 17 日
网站上次更新:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。