mrabarnett/mrab-regex

GitHub: mrabarnett/mrab-regex

一个向后兼容 Python 标准 「re」 模块的高级正则表达式库,提供了模糊匹配、完整 Unicode 支持、并发安全等大量增强功能。

Stars: 588 | Forks: 71

## 简介 此 regex 实现向后兼容标准的 're' 模块,但提供了额外的功能。 ## Python 2 不再支持 Python 2。最后一个支持 Python 2 的版本是 2021.11.10。 ## PyPy 此模块针对 CPython。它期望所有码位宽度相同,因此在 U+0000..U+007F 范围之外的 PyPy 中它将无法正常工作,因为 PyPy 将字符串存储为 UTF-8。 ## 多线程 regex 模块在内置(不可变)字符串类的实例上进行匹配时会释放 GIL,从而使其他 Python 线程能够并发运行。也可以通过使用关键字参数 ``concurrent=True`` 调用匹配方法来强制 regex 模块在匹配期间释放 GIL。如果在匹配期间字符串发生更改,则行为是未定义的,因此*仅*在保证不会发生这种情况时才使用它。 ## Unicode 此模块支持 Unicode 17.0.0。支持完整的 Unicode 大小写折叠。 ## 标志 标志分为 2 种:局部标志和全局标志。局部标志可以仅应用于模式的一部分,并且可以打开或关闭;全局标志应用于整个模式,并且只能打开。 局部标志包括:``ASCII (?a)``、``FULLCASE (?f)``、``IGNORECASE (?i)``、``LOCALE (?L)``、``MULTILINE (?m)``、``DOTALL (?s)``、``UNICODE (?u)``、``VERBOSE (?x)``、``WORD (?w)``。 全局标志包括:``BESTMATCH (?b)``、``ENHANCEMATCH (?e)``、``POSIX (?p)``、``REVERSE (?r)``、``VERSION0 (?V0)``、``VERSION1 (?V1)``。 如果未指定 ``ASCII``、``LOCALE`` 或 ``UNICODE`` 标志,则当 regex 模式是 Unicode 字符串时默认为 ``UNICODE``,如果是字节串则默认为 ``ASCII``。 ``ENHANCEMATCH`` 标志使模糊匹配尝试改善其找到的下一个匹配的契合度。 ``BESTMATCH`` 标志使模糊匹配搜索最佳匹配而不是下一个匹配。 ## 新旧行为对比 为了与 re 模块兼容,此模块具有 2 种行为: * **版本 0** 行为(旧行为,与 re 模块兼容): 请注意,re 模块的行为可能会随时间改变,我将努力在版本 0 中匹配该行为。 * 由 ``VERSION0`` 标志指示。 * 在 Python 3.7 之前,re 模块未正确处理零宽度匹配。这些早期版本中的行为是: * ``.split`` 不会在零宽度匹配处拆分字符串。 * ``.sub`` 在零宽度匹配后会前进一个字符。 * 内联标志应用于整个模式,并且不能被关闭。 * 仅支持简单集合。 * Unicode 中的不区分大小写匹配默认使用简单大小写折叠。 * **版本 1** 行为(新行为,可能与 re 模块不同): * 由 ``VERSION1`` 标志指示。 * 零宽度匹配被正确处理。 * 内联标志应用于组或模式的末尾,并且可以被关闭。 * 支持嵌套集合和集合操作。 * Unicode 中的不区分大小写匹配默认使用完整大小写折叠。 如果未指定版本,regex 模块将默认使用 ``regex.DEFAULT_VERSION``。 ## Unicode 中的不区分大小写匹配 regex 模块支持 Unicode 不区分大小写匹配的简单和完整大小写折叠。可以使用 ``FULLCASE`` 标志启用完整大小写折叠。请注意,此标志影响 ``IGNORECASE`` 标志的工作方式;``FULLCASE`` 标志本身不会启用不区分大小写的匹配。 版本 0 行为:该标志默认关闭。 版本 1 行为:该标志默认打开。 ## 嵌套集合和集合操作 由于未转义的 ``"["`` 在集合中的含义不同,因此无法像 re 模块那样同时支持简单集合和嵌套集合。 例如,模式 ``[[a-z]--[aeiou]]`` 在版本 0 行为(简单集合,与 re 模块兼容)中被视为: * 包含 "[" 和字母 "a" 到 "z" 的集合 * 字面值 "--" * 包含字母 "a"、"e"、"i"、"o"、"u" 的集合 * 字面值 "]" 但在版本 1 行为(嵌套集合,增强行为)中被视为: * 集合,它是: * 包含字母 "a" 到 "z" 的集合 * 但排除: * 包含字母 "a"、"e"、"i"、"o"、"u" 的集合 版本 0 行为:仅支持简单集合。 版本 1 行为:支持嵌套集合和集合操作。 ## 关于命名组的说明 所有组都有一个组号,从 1 开始。 具有相同组名的组将具有相同的组号,而具有不同组名的组将具有不同的组号。 多个组可以使用相同的名称,后面的捕获会“覆盖”前面的捕获。该组的所有捕获都可以通过匹配对象的 ``captures`` 方法获取。 组号将在分支重置的不同分支中重用,例如,``(?|(first)|(second))`` 只有组 1。如果组具有不同的组名,那么它们当然会具有不同的组号,例如,``(?|(?Pfirst)|(?Psecond))`` 具有组 1 ("foo") 和组 2 ("bar")。 在 regex ``(\s+)(?|(?P[A-Z]+)|(\w+) (?P[0-9]+)`` 中有 2 个组: * ``(\s+)`` 是组 1。 * ``(?P[A-Z]+)`` 是组 2,也称为 "foo"。 * 由于分支重置,``(\w+)`` 是组 2。 * 由于它被称为 "foo",``(?P[0-9]+)`` 是组 2。 如果你想阻止 ``(\w+)`` 成为组 2,你需要为它命名(不同的名称,不同的组号)。 ## 附加功能 问题编号与 Python 错误跟踪器相关,除非另有说明。 ## 添加了 ``\p{Horiz_Space}`` 和 ``\p{Vert_Space}`` (`GitHub issue 477 `_) ``\p{Horiz_Space}`` 或 ``\p{H}`` 匹配水平空白字符,``\p{Vert_Space}`` 或 ``\p{V}`` 匹配垂直空白字符。 ## 添加了对条件模式中的环视支持 (`Hg issue 163 `_) 条件模式的测试可以是一个环视。 .. sourcecode:: python 这与将环视放在一对备选分支的第一个分支中并不完全相同。 .. sourcecode:: python 在第一个示例中,环视匹配成功,但第一个分支的其余部分匹配失败,因此尝试了第二个分支;而在第二个示例中,环视匹配成功,并且第一个分支匹配失败,但**未**尝试第二个分支。 ## 添加了 POSIX 匹配(最左侧最长) (`Hg issue 150 `_) regex 的 POSIX 标准是返回最左侧最长的匹配。这可以使用 ``POSIX`` 标志来开启。 .. sourcecode:: python 请注意,查找匹配将花费更长的时间,因为当它在某个位置找到匹配时,它不会立即返回,而是会继续查看该位置是否还有另一个更长的匹配。 ## 添加了 ``(?(DEFINE)...)`` (`Hg issue 152 `_) 如果没有名为 "DEFINE" 的组,那么 ... 将被忽略,除了在其中定义的任何组都可以被调用,并且组编号的常规规则仍然适用。 .. sourcecode:: python ## 添加了 ``(*PRUNE)``、``(*SKIP)`` 和 ``(*FAIL)`` (`Hg issue 153 `_) ``(*PRUNE)`` 丢弃到该点为止的回溯信息。在原子组或环视中使用时,它不会影响封闭模式。 ``(*SKIP)`` 类似于 ``(*PRUNE)``,不同之处在于它还设置了文本中下一次尝试匹配的起始位置。在原子组或环视中使用时,它不会影响封闭模式。 ``(*FAIL)`` 导致立即回溯。``(*F)`` 是一个允许的缩写。 ## 添加了 ``\K`` (`Hg issue 151 `_) 保留出现 ``\K`` 位置之后的整个匹配部分;它之前的部分被丢弃。 它不影响组返回的内容。 .. sourcecode:: python ## 为 ``expandf`` 和 ``subf``/``subfn`` 添加了捕获下标 (`Hg issue 133 `_) 你可以使用下标来获取重复组的捕获。 .. sourcecode:: python ## 添加了使用 ``(?P=...)`` 按编号引用组的支持 这是对现有 ``\g<...>`` 的补充。 ## 修复了对区域设置敏感的 regex 的处理 ``LOCALE`` 标志专为遗留代码设计,支持有限。仍然建议你改用 Unicode。 ## 添加了部分匹配 (`Hg issue 102 `_) 部分匹配是指匹配到字符串末尾的匹配,但该字符串已被截断,而你想知道如果字符串没有被截断,是否可能存在完整匹配。 ``match``、``search``、``fullmatch`` 和 ``finditer`` 通过 ``partial`` 关键字参数支持部分匹配。 匹配对象具有 ``partial`` 属性,如果它是部分匹配,则为 ``True``。 例如,如果你希望用户输入一个 4 位数字,并在输入时逐个字符进行检查: .. sourcecode:: python ## ``*`` 运算符在 sub() 中无法正常工作 (`Hg issue 106 `_) 有时如何处理零宽度匹配并不明确。例如,``.*`` 在匹配了 >0 个字符后是否应该直接匹配 0 个字符? .. sourcecode:: python ## 添加了 ``capturesdict`` (`Hg issue 86 `_) ``capturesdict`` 是 ``groupdict`` 和 ``captures`` 的结合: ``groupdict`` 返回命名组及其最后捕获的字典。 ``captures`` 返回一个组的所有捕获的列表。 ``capturesdict`` 返回命名组及其所有捕获列表的字典。 .. sourcecode:: python ## 添加了 ``allcaptures`` 和 ``allspans`` (`Git issue 474 `_) ``allcaptures`` 返回所有组的所有捕获的列表。 ``allspans`` 返回所有组的所有捕获跨度的列表。 .. sourcecode:: python ## 允许重复的组名 (`Hg issue 87 `_) 组名可以重复。 .. sourcecode:: python ## 添加了 ``fullmatch`` (`issue #16203 `_) ``fullmatch`` 的行为类似于 ``match``,不同之处在于它必须匹配整个字符串。 .. sourcecode:: python ## 添加了 ``subf`` 和 ``subfn`` ``subf`` 和 ``subfn`` 分别是 ``sub`` 和 ``subn`` 的替代方法。当传递替换字符串时,它们将其视为格式字符串。 .. sourcecode:: python ## 为匹配对象添加了 ``expandf`` ``expandf`` 是 ``expand`` 的替代方法。当传递替换字符串时,它将其视为格式字符串。 .. sourcecode:: python ## 分离搜索字符串 匹配对象通过其 ``string`` 属性包含对被搜索字符串的引用。``detach_string`` 方法将“分离”该字符串,使其可以被垃圾回收,如果该字符串非常大,这可能会节省宝贵的内存。 .. sourcecode:: python ## 递归模式 (`Hg issue 27 `_) 支持递归和重复模式。 ``(?R)`` 或 ``(?0)`` 尝试递归匹配整个 regex。``(?1)``、``(?2)`` 等尝试匹配相应的组。 ``(?&name)`` 尝试匹配命名组。 .. sourcecode:: python 前两个示例展示了组内的子模式是如何被重用的,但它本身_不是_一个组。换句话说,``"(Tarzan|Jane) loves (?1)"`` 等同于 ``"(Tarzan|Jane) loves (?:Tarzan|Jane)"``。 可以回溯到递归或重复的组中。 存在多个具有该组名或组号的组,则无法调用该组(``"ambiguous group reference"``)。 也支持备选形式 ``(?P>name)`` 和 ``(?P&name)``。 ## 支持完整的 Unicode 大小写折叠 在版本 1 行为中,regex 模块在执行 Unicode 不区分大小写匹配时使用完整大小写折叠。 .. sourcecode:: python 在版本 0 行为中,它使用简单大小写折叠以向后兼容 re 模块。 ## 近似“模糊”匹配 (`Hg issue 12 `_,`Hg issue 41 `_,`Hg issue 109 `_) Regex 通常尝试精确匹配,但有时需要近似或“模糊”匹配,适用于所搜索的文本可能包含插入、删除或替换字符形式的错误的情况。 模糊 regex 指定允许哪些类型的错误,并可选地指定每种类型的最小和最大数量或仅最大允许数量。(你不能仅指定最小数量。) 3 种错误类型是: * 插入,用 "i" 表示 * 删除,用 "d" 表示 * 替换,用 "s" 表示 此外,"e" 表示任何类型的错误。 regex 项的模糊度在项之后的 "{" 和 "}" 之间指定。 示例: * ``foo`` 精确匹配 "foo" * ``(?:foo){i}`` 匹配 "foo",允许插入 * ``(?:foo){d}`` 匹配 "foo",允许删除 * ``(?:foo){s}`` 匹配 "foo",允许替换 * ``(?:foo){i,s}`` 匹配 "foo",允许插入和替换 * ``(?:foo){e}`` 匹配 "foo",允许错误 如果指定了某种类型的错误,则任何未指定的类型将**不**被允许。 在以下示例中,我将省略该项,仅编写模糊度: * ``{d<=3}`` 允许最多 3 次删除,但不允许其他类型 * ``{i<=1,s<=2}`` 允许最多 1 次插入和最多 2 次替换,但不允许删除 * ``{1<=e<=3}`` 允许至少 1 次且最多 3 次错误 * ``{i<=2,d<=2,e<=3}`` 允许最多 2 次插入,最多 2 次删除,总共最多 3 次错误,但不允许替换 还可以声明每种类型错误的成本和最大允许总成本。 示例: * ``{2i+2d+1s<=4}`` 每次插入成本为 2,每次删除成本为 2,每次替换成本为 1,总成本不得超过 4 * ``{i<=1,d<=1,s<=1,2i+2d+1s<=4}`` 最多 1 次插入,最多 1 次删除,最多 1 次替换;每次插入成本为 2,每次删除成本为 2,每次替换成本为 1,总成本不得超过 4 如果你想要排他性的最小值或最大值,你也可以使用 "<" 代替 "<="。 你可以添加一个测试,以对被替换或插入的字符执行。 示例: * ``{s<=2:[a-z]}`` 最多 2 次替换,且必须在字符集 ``[a-z]`` 中。 * ``{s<=2,i<=3:\d}`` 最多 2 次替换,最多 3 次插入,且必须是数字。 默认情况下,模糊匹配搜索满足给定约束的第一个匹配。``ENHANCEMATCH`` 标志将使其尝试改善其找到的匹配的契合度(即减少错误数量)。 ``BESTMATCH`` 标志将使其搜索最佳匹配。 需要注意的更多示例: * ``regex.search("(dog){e}", "cat and dog")[1]`` 返回 ``"cat"``,因为它匹配 ``"dog"`` 有 3 个错误(允许无限数量的错误)。 * ``regex.search("(dog){e<=1}", "cat and dog")[1]`` 返回 ``" dog"``(带前导空格),因为它匹配 ``"dog"`` 有 1 个错误,在限制范围内。 * ``regex.search("(?e)(dog){e<=1}", "cat and dog")[1]`` 返回 ``"dog"``(不带前导空格),因为模糊搜索匹配 ``" dog"`` 有 1 个错误,在限制范围内,并且 ``(?e)`` 随后尝试更好的契合度。 在前两个示例中,字符串后面有完美匹配,但在两种情况下它都不是第一个可能的匹配。 匹配对象具有 ``fuzzy_counts`` 属性,它给出替换、插入和删除的总数。 .. sourcecode:: python 匹配对象还具有 ``fuzzy_changes`` 属性,它给出替换、插入和删除位置的元组。 .. sourcecode:: python 这意味着如果字符串的匹配部分是: .. sourcecode:: python 'anacondfuuoo bar' 那将是一个精确匹配。 然而,在位置 7 和 8 处有插入: .. sourcecode:: python 'anaconda fuuoo bar' ^^ 在位置 10 和 11 处有删除: .. sourcecode:: python 'anaconda f~~oo bar' ^^ 所以实际的字符串是: .. sourcecode:: python 'anaconda foo bar' ## 命名列表 ``\L`` (`Hg issue 11 `_) 在某些情况下,你可能希望在 regex 中包含一个选项列表(实际上是一个集合)。 一种方法是像这样构建模式: .. sourcecode:: python 但是如果列表很大,解析生成的 regex 可能会花费大量时间,并且还必须注意字符串是否已正确转义和正确排序,例如,"cats" 要排在 "cat" 之前。 新的替代方法是使用命名列表: .. sourcecode:: python 项的顺序无关紧要,它们被视为一个集合。命名列表可以通过模式对象的 ``.named_lists`` 属性获取: .. sourcecode:: python 如果有任何未使用的关键字参数,将引发 ``ValueError``,除非你另行指定: .. sourcecode:: python ## 单词的开头和结尾 ``\m`` 在单词的开头匹配。 ``\M`` 在单词的结尾匹配。 与 ``\b`` 相比,后者在单词的开头或结尾匹配。 ## Unicode 行分隔符 通常唯一的行分隔符是 ``\n`` (``\x0A``),但如果开启了 ``WORD`` 标志,则行分隔符为 ``\x0D\x0A``、``\x0A``、``\x0B``、``\x0C`` 和 ``\x0D``,加上在处理 Unicode 时的 ``\x85``、``\u2028`` 和 ``\u2029``。 这会影响 regex 点 ``"."``,在关闭 ``DOTALL`` 标志时,它匹配除行分隔符之外的任何字符。它还会影响行锚点 ``^`` 和 ``$``(在多行模式下)。 ## 集合运算符 **仅限版本 1 行为** 添加了集合运算符,并且集合 ``[...]`` 可以包含嵌套集合。 运算符按优先级递增的顺序依次为: * ``||`` 用于并集("x||y" 表示 "x 或 y") * ``~~``(双波浪号)用于对称差("x~~y" 表示 "x 或 y,但不能同时包含两者") * ``&&`` 用于交集("x&&y" 表示 "x 和 y") * ``--``(双连字符)用于差集("x--y" 表示 "包含 x 但不包含 y") 隐式并集,即像 ``[ab]`` 中的简单并列,具有最高的优先级。因此,``[ab&&cd]`` 与 ``[[a||b]&&[c||d]]`` 相同。 示例: * ``[ab]`` # 包含 'a' 和 'b' 的集合 * ``[a-z]`` # 包含 'a' .. 'z' 的集合 * ``[[a-z]--[qw]]`` # 包含 'a' .. 'z' 但不包含 'q' 或 'w' 的集合 * ``[a-z--qw]`` # 与上述相同 * ``[\p{L}--QW]`` # 包含除 'Q' 和 'W' 之外所有字母的集合 * ``[\p{N}--[0-9]]`` # 包含除 '0' .. '9' 之外所有数字的集合 * ``[\p{ASCII}&&\p{Letter}]`` # 包含所有属于 ASCII 且为字母的字符的集合 ## regex.escape (`issue #2650 `_) regex.escape 有一个额外的关键字参数 ``special_only``。当为 True 时,仅转义“特殊”的 regex 字符,例如 '?'。 .. sourcecode:: python ## regex.escape (`Hg issue 249 `_) regex.escape 有一个额外的关键字参数 ``literal_spaces``。当为 True 时,空格不会被转义。 .. sourcecode:: python ## 重复捕获 (`issue #7132 `_) 匹配对象具有额外的方法,可返回有关重复组的所有成功匹配的信息。这些方法是: * ``matchobject.captures([group1, ...])`` * 返回在一个或多个组中匹配的字符串列表。与 ``matchobject.group([group1, ...])`` 相比。 * ``matchobject.starts([group])`` * 返回起始位置的列表。与 ``matchobject.start([group])`` 相比。 * ``matchobject.ends([group])`` * 返回结束位置的列表。与 ``matchobject.end([group])`` 相比。 * ``matchobject.spans([group])`` * 返回跨度的列表。与 ``matchobject.span([group])`` 相比。 .. sourcecode:: python ## 原子分组 ``(?>...)`` (`issue #433030 `_) 如果后续的模式匹配失败,那么整个子模式将失败。 ## 占有量词 ``(?:...)?+`` ; ``(?:...)*+`` ; ``(?:...)++`` ; ``(?:...){min,max}+`` 子模式最多匹配 'max' 次。如果后续的模式匹配失败,那么所有重复的子模式将作为一个整体失败。例如,``(?:...)++`` 等同于 ``(?>(?:...)+)``。 ## 局部标志 (`issue #433028 `_) ``(?flags-flags:...)`` 标志将仅应用于子模式。标志可以打开或关闭。 ## “单词”字符的定义 (`issue #1693050 `_) Unicode 扩展了“单词”字符的定义。它符合 ``http://www.unicode.org/reports/tr29/`` 上的 Unicode 规范。 ## 可变长度逆向断言 逆向断言可以匹配可变长度的字符串。 ## regex.split、regex.sub 和 regex.subn 的标志参数 (`issue #3482 `_) ``regex.split``、``regex.sub`` 和 ``regex.subn`` 支持 'flags' 参数。 ## regex.sub 和 regex.subn 的 pos 和 endpos 参数 ``regex.sub`` 和 ``regex.subn`` 支持 'pos' 和 'endpos' 参数。 ## regex.findall 和 regex.finditer 的 'Overlapped' 参数 ``regex.findall`` 和 ``regex.finditer`` 支持 'overlapped' 标志,该标志允许重叠匹配。 ## Splititer 添加了 ``regex.splititer``。它是 ``regex.split`` 的生成器等价物。 ## 匹配对象的组下标访问 匹配对象允许通过下标和切片访问组: .. sourcecode:: python ## 命名组 可以使用 ``(?...)`` 以及现有的 ``(?P...)`` 来命名组。 ## 组引用 可以在模式内使用 ``\g`` 引用组。这也允许存在超过 99 个组。 ## 命名字符 ``\N{name}`` 支持命名字符。请注意,只有 Python 的 Unicode 数据库已知的字符才能被识别。 ## Unicode 码位属性,包括文字和区块 ``\p{property=value}``;``\P{property=value}``;``\p{value}`` ;``\P{value}`` 支持许多 Unicode 属性,包括区块和文字。``\p{property=value}`` 或 ``\p{property:value}`` 匹配其属性 ``property`` 值为 ``value`` 的字符。``\p{property=value}`` 的逆是 ``\P{property=value}`` 或 ``\p{^property=value`。 如果使用短格式 ``\p{value}``,则按以下顺序检查属性:``General_Category``、``Script``、``Block``、二元属性: * ``Latin``,'Latin' 文字(``Script=Latin``)。 * ``BasicLatin``,'BasicLatin' 区块(``Block=BasicLatin``)。 * ``Alphabetic``,'Alphabetic' 二元属性(``Alphabetic=Yes``)。 以 ``Is`` 开头的短格式表示文字或二元属性: * ``IsLatin``,'Latin' 文字(``Script=Latin``)。 * ``IsAlphabetic``,'Alphabetic' 二元属性(``Alphabetic=Yes``)。 以 ``In`` 开头的短格式表示区块属性: * ``InBasicLatin``,'BasicLatin' 区块(``Block=BasicLatin``)。 ## POSIX 字符类 ``[[:alpha:]]``;``[[:^alpha:]]`` 支持 POSIX 字符类。它们通常被视为 ``\p{...}`` 的替代形式。 例外是 ``alnum``、``digit``、``punct`` 和 ``xdigit``,它们的定义与 Unicode 的定义不同。 ``[[:alnum:]]`` 等同于 ``\p{posix_alnum}``。 ``[[:digit:]]`` 等同于 ``\p{posix_digit}``。 ``[[:punct:]]`` 等同于 ``\p{posix_punct}``。 ``[[:xdigit:]]`` 等同于 ``\p{posix_xdigit}``。 ## 搜索锚点 ``\G`` 添加了搜索锚点。它在每次搜索开始/继续的位置匹配,可用于连续匹配或在否定式可变长度逆向断言中限制逆向断言回溯的距离: .. sourcecode:: python * 搜索从位置 0 开始并匹配 'ab'。 * 搜索从位置 2 继续并匹配 'cd'。 * 搜索从位置 4 继续但未能匹配任何字母。 * 锚点阻止了搜索起始位置的前进,因此没有更多结果。 ## 反向搜索 搜索也可以向后进行: .. sourcecode:: python 请注意,反向搜索的结果不一定是正向搜索结果的反转: .. sourcecode:: python ## 匹配单个字位 ``\X`` 支持字位匹配器。它符合 ``http://www.unicode.org/reports/tr29/`` 上的 Unicode 规范。 ## 分支重置 ``(?|...|...)`` 组号将在备选分支中重用,但具有不同名称的组将具有不同的组号。 .. sourcecode:: python 请注意,这里只有一个组。 ## 默认的 Unicode 词边界 ``WORD`` 标志将“词边界”的定义更改为默认的 Unicode 词边界。这适用于 ``\b`` 和 ``\B``。 ## 超时 匹配方法和函数支持超时。超时(以秒为单位)适用于整个操作: .. sourcecode:: python
标签:CPython, Python, Unicode, 参数发现, 字符串处理, 客户端加密, 并发, 文本分析, 文本匹配, 无后门, 模糊匹配, 脚本编程, 软件开发, 逆向工具