我正在尝试正确地分割英语句子,我想出了下面的邪恶正则表达式:
(?<!\d|([A-Z]\.)|(\.[a-z]\.)|(\.\.\.)|etc\.|[Pp]rof\.|[Dd]r\.|[Mm]rs\.|[Mm]s\.|[Mm]z\.|[Mm]me\.)(?<=([\.!?])|(?<=([\.!?][\'\"])))[\s]+?(?=[\S])'
Run Code Online (Sandbox Code Playgroud)
问题是,Python不断引发以下错误:
Traceback (most recent call last):
File "", line 1, in
File "sp.py", line 55, in analyze
self.sentences = re.split(god_awful_regex, self.inputstr.strip())
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.py", line 165, in split
return _compile(pattern, 0).split(string, maxsplit)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.py", line 243, in _compile
raise error, v # invalid expression
sre_constants.error: look-behind requires fixed-width pattern
Run Code Online (Sandbox Code Playgroud)
为什么这不是有效的固定宽度正则表达式?我没有使用任何重复字符(*或+),只是|.
编辑 @Anomie解决了这个问题 - 非常感谢!不幸的是,我不能使新的表达平衡:
(?<!(\d))(?<![A-Z]\.)(?<!\.[a-z]\.)(?<!(\.\.\.))(?<!etc\.)(?<![Pp]rof\.)(?<![Dd]r\.)(?<![Mm]rs\.)(?<![Mm]s\.)(?<![Mm]z\.)(?<![Mm]me\.)(?:(?<=[\.!?])|(?<=[\.!?][\'\"\]))[\s]+?(?=[\S])
Run Code Online (Sandbox Code Playgroud)
就是我现在拥有的.但是(的匹配数量是('s',但是:
>>> god_awful_regex = r'''(?<!(\d))(?<![A-Z]\.)(?<!\.[a-z]\.)(?<!(\.\.\.))(?<!etc\.)(?<![Pp]rof\.)(?<![Dd]r\.)(?<![Mm]rs\.)(?<![Mm]s\.)(?<![Mm]z\.)(?<![Mm]me\.)(?:(?<=[\.!?])|(?<=[\.!?][\'\"\]))[\s]+?(?=[\S])'''
>>> god_awful_regex.count('(')
17
>>> god_awful_regex.count(')')
17
>>> god_awful_regex.count('[')
13
>>> god_awful_regex.count(']')
13
Run Code Online (Sandbox Code Playgroud)
还有什么想法吗?
Ano*_*mie 11
考虑这个子表达式:
(?<=([\.!?])|(?<=([\.!?][\'\"])))
Run Code Online (Sandbox Code Playgroud)
|的左侧 是一个字符,而正确的大小是零.您在较大的负面后视中也有同样的问题,它可能是1,2,3,4或5个字符.
从逻辑上讲,负面的后视(?<!A|B|C)应该相当于一系列的后视(?<!A)(?<!B)(?<!C).积极的背后(?<=A|B|C)应该相当于(?:(?<=A)|(?<=B)|(?<=C)).
| 归档时间: |
|
| 查看次数: |
5265 次 |
| 最近记录: |