【发布时间】:2016-12-09 04:37:00
【问题描述】:
我正在访问一些旧的 python 代码,以前没有抛出任何错误,但是当我尝试运行它时遇到了错误。这是给我一个错误的代码:
import re
text = r"I quote \"How're you?\" to you."
double = [z.start() for z in re.finditer('(?<!\\)(?:\\\\)*(")', text)]
single = [z.start() for z in re.finditer("(?<!\\)(?:\\\\)*(')", text)]
print(double)
print(single)
我希望从这个程序中得到的输出是:
[]
[13]
然而,这给了我错误:
double = [z.start() for z in re.finditer('(?<!(?:\\))(?:\\\\)*(")', text)]
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 220, in finditer
return _compile(pattern, flags).finditer(string)
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 293, in _compile
p = sre_compile.compile(pattern, flags)
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\sre_compile.py", line 536, in compile
p = sre_parse.parse(p, flags)
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 829, in parse
p = _parse_sub(source, pattern, 0)
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 437, in _parse_sub
itemsappend(_parse(source, state))
File "C:\Users\Me\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 722, in _parse
source.tell() - start)
sre_constants.error: missing ), unterminated subpattern at position 0
值得一提的是我在运行这个之前已经更新了python,那么可能是python的更新导致了这个错误? (我现在正在运行python 3.5.2,但是我不记得之前是什么了)
另外,如果有帮助,我试图找到所有没有被反斜杠转义的单引号或双引号,即
' 和 " 被拾取
\' 和 \" 不是
\' 和 \" 被拾取等等...
我打算使用它来将字符串中的嵌套字符串与字符串的其他部分分开。
这是导致问题的负面后视 (?
奇怪的是,这适用于regex101,所以我开始没有办法调试它了。
我尝试了不同的替代方法来替代负面的后视,以试图让它发挥作用:
(?<!\) #Gets the error, but that is expected
(?<!\\\\) #Same error again, same problem as the original case
(?<!\\\) #Returns [8, 20] and [13]
很明显,最后一个语法不正确。然而,Python 将其解释为正确,但我不知道它实际上将其解释为什么。
无论如何,我知道可能有一些简单的解释,也许是一些我不知道的 RegEx 语法。
另外,如果我正在尝试的方法有一个替代的、不那么混乱的解决方案,请随时给我那个解决方案。
非常感谢,我的头发都快掉光了,
EdW
【问题讨论】:
-
regex101 自动将其设为原始字符串
r'...'。可以试试吗?
标签: python python-3.5