我正在访问一些旧的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 ,所以我开始用尽所有方法来调试它。
我尝试了不同的替代品来替代消极的lookbehind,以使其发挥作用:
(?<!\) #Gets the error, but that is expected
(?<!\\\\) #Same error again, same problem as the original case
(?<!\\\) #Returns [8, 20] and [13]
显然最后一个语法不正确。然而,Python 将此解释为正确的,但我不知道它实际上将其解释为什么。
无论如何,我知道可能有一些简单的解释,也许是一些我不知道的正则表达式语法。
此外,如果有替代的、不那么困惑的解决方案来代替我正在尝试的解决方案,请随时给我该解决方案。
非常感谢,我差点把头发扯下来,
埃德W
最佳答案
只需将 r
添加到正则表达式字符串的前面
import re
text = r"I quote \"How're you?\" to you."
double = [z.start() for z in re.finditer(r'(?<!\\)(?:\\\\)*(")', text)]
single = [z.start() for z in re.finditer(r"(?<!\\)(?:\\\\)*(')", text)]
print(double)
print(single)
输出:
[]
[13]
关于Python RegEx 缺少括号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41048286/