如果遇到同样的问题,请更新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
看来此错误与回溯有关。当重复捕获组,并且捕获组匹配但该组之后的模式不匹配时,会发生这种情况。
一个例子:
>>> 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)
| 归档时间: |
|
| 查看次数: |
6718 次 |
| 最近记录: |