Python RegEx缺少括号错误

时间:2016-12-08 20:30:36

标签: 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,但我无法记住之前的情况)

另外,如果它有帮助,我试图找到所有未被反斜杠转义的单引号或双引号的情况,即

&#39;和&#34;被接走

\&#39;和\&#34;不是

\&#39;和\&#34;被拾起等等......

我打算用它来将字符串中的嵌套字符串与字符串的其他部分分开。

导致问题的是负面的后视(?&lt;!\\),但我看不出有什么问题。反斜杠由前面的那个转义,所以我看不到丢失的括号在哪里。

奇怪的是,这适用于regex101,所以我开始没有办法调试它。

我为负面的lookbehind尝试了不同的替换,试图让它工作:

(?<!\) #Gets the error, but that is expected

(?<!\\\\) #Same error again, same problem as the original case

(?<!\\\) #Returns [8, 20] and [13]

显然,最后一个语法不正确。然而,Python正在将此解释为正确,但我不知道它实际上将其解释为。

无论如何,我知道可能有一些简单的解释,也许是一些我不知道的RegEx语法。

此外,如果有一个替代方案,对我正在尝试的内容不那么混乱,请随时给我这个解决方案。

非常感谢,我几乎要撕掉我的头发,

EDW

1 个答案:

答案 0 :(得分:1)

只需将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]