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