Python RegEx 缺少括号错误

标签 python python-3.5

我正在访问一些旧的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/

相关文章:

python - 使用virtualenv时如何安装python-devel

python - 如何使用 strftime 以正确的顺序绘制月份名称?

python - 每次调用python脚本时如何避免重新加载ML模型?

python - 属性错误: module 'tox.config' has no attribute 'parseini'

javascript - 如何从 Python 执行 JavaScript 代码?

python - 一个非常简单的python异步应用程序

python - 如何在Python3中合并两个不相等的输入/列表

java - Tomcat 的 Python 等价物是什么?

python - "Order By" Elasticsearch

Python - 了解传递给递归函数的变量的范围