Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式缺少括号错误_Python_Python 3.5 - Fatal编程技术网

Python正则表达式缺少括号错误

Python正则表达式缺少括号错误,python,python-3.5,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("(?<!\\)(?:\\\\)*(

我访问了一些旧的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)
但是,这给了我一个错误:

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
double=[z.start(),用于re.finditer(')(?
\'和\'不是

\“和\”被拾取,等等

我打算用它来分离字符串中的嵌套字符串和字符串的其他部分

这是消极的回头看(?)? 奇怪的是,这是有效的,所以我开始用尽各种方法来调试它

我尝试了不同的替换方法来替换负面查找,以使其正常工作:

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

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

(?<!\\\) #Returns [8, 20] and [13]
(?
显然,最后一个语法不正确。然而,Python将其解释为正确的,但我不知道它实际将其解释为什么

无论如何,我知道可能有一些简单的解释,可能是一些我不知道的正则表达式语法

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

非常感谢,我几乎要把头发扯下来了


EdW

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

regex101会自动将其设置为原始字符串
r'…'
。也许可以尝试一下吗?说得清楚一点,这是因为它禁用了字符串文本的反斜杠转义行为,除非以下字符是用于开始字符串的引号字符。如果不这样做,则传递给
finditer
的内容包含e字面值字符
(?哇……这比我想象的要简单得多。至少我做得“正确”了,只是python试图“有帮助”。感谢Navidad的回复,感谢ShadowRanger的解释。@EdW:嗯,python在这里做得很正确。问题是它在其他场景中做得不正确,例如允许
\d
\s
等,将其解释为后跟字母的反斜杠(因此它们到达正则表达式引擎并被正确解释),虽然
\b
\\
和其他一些ASCII转义以及正则表达式转义都被解释为它们的转义值。Python将
\\
转换为
\
是正确的,只是它应该转换更多的反斜杠转义,以便人们一致地解决这个问题,而不是直到t嘿,我遇到了一个例外。
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]