Python正则表达式模块与重新模块 - 模式不匹配

Fab*_* N. 15 python regex

更新:此问题已由提交者在be893e9中解决

如果遇到同样的问题,请更新regex模块.
您需要2017.04.23或更高版本.


正如在这个答案中指出的, 我需要这个正则表达式:

(?i)\b((\w{1,3})(-|\.{2,10})[\t ]?)+(\2\w{2,})
Run Code Online (Sandbox Code Playgroud)

regex模块一起工作......

import re     # standard library
import regex  # https://pypi.python.org/pypi/regex/

content = '"Erm....yes. T..T...Thank you for that."'
pattern = r"(?i)\b((\w{1,3})(-|\.{2,10})[\t ]?)+(\2\w{2,})"
substitute = r"\2-\4"

print(re.sub(pattern, substitute, content))
print(regex.sub(pattern, substitute, content))
Run Code Online (Sandbox Code Playgroud)

输出:

"Erm....yes. T-Thank you for that."
"-yes. T..T...Thank you for that."
Run Code Online (Sandbox Code Playgroud)

问:我如何编写此正则表达式以使regex模块以与re模块相同的方式对其作出反应?

使用该re模块不是一个选项,因为我需要具有动态长度的后视镜.

为了澄清:如果正则表达式适用于两个模块会很好,但最后我只需要它regex

Ara*_*Fey 5

看来此错误与回溯有关。当重复捕获组,并且捕获组匹配但该组之后的模式不匹配时,会发生这种情况。

一个例子:

>>> regex.sub(r'(?:(\d{1,3})x)+', r'\1', '123x5')
'5'
Run Code Online (Sandbox Code Playgroud)

供参考,预期输出为:

>>> re.sub(r'(?:(\d{1,3})x)+', r'\1', '123x5')
'1235'
Run Code Online (Sandbox Code Playgroud)

在第一次迭代中,捕获组(\d{1,3})使用前3位数字,并x使用以下“ x”字符。然后,由于,+尝试进行第二次匹配。这次,(\d{1,3})匹配“ 5”,但x不匹配。但是,捕获组的值现在(重新)设置为空字符串,而不是期望的字符串123

解决方法是,我们可以防止捕获组匹配。在这种情况下,将其更改(\d{2,3})为足以绕过该错误(因为它不再匹配“ 5”):

>>> regex.sub(r'(?:(\d{2,3})x)+', r'\1', '123x5')
'1235'
Run Code Online (Sandbox Code Playgroud)

至于所讨论的模式,我们可以使用前瞻性断言。我们更改(\w{1,3})(?=\w{1,3}(?:-|\.\.))(\w{1,3})

>>> pattern= r"(?i)\b((?=\w{1,3}(?:-|\.\.))(\w{1,3})(-|\.{2,10})[\t ]?)+(\2\w{2,})"
>>> regex.sub(pattern, substitute, content)
'"Erm....yes. T-Thank you for that."'
Run Code Online (Sandbox Code Playgroud)

  • 我想到了; 有必要防止捕获组与_at all_匹配。我不得不将前瞻性断言移到捕获组的前面。答案已更新。 (2认同)