Windows 7 64位上的Python 3.6.7 64位
mystring = r'somestring:directory\file.txt'
我想从mystring中提取“目录”。
使用mydir = re.search(r':(.+)\', mystring).group(1)
时出现以下错误
mydir = re.search(r':(.+)\', mystring).group(1)
SyntaxError: EOL while scanning string literal
使用mydir = re.search(':(.+)\\', mystring).group(1)
时出现以下错误
Traceback (most recent call last):
File "/usr/lib/python3.4/sre_parse.py", line 194, in __next
c = self.string[self.index + 1]
IndexError: string index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/main.py", line 10, in <module>
mydir = re.search(':(.+)\\', mystring).group(1)
File "/usr/lib/python3.4/re.py", line 166, in search
return _compile(pattern, flags).search(string)
File "/usr/lib/python3.4/re.py", line 288, in _compile
p = sre_compile.compile(pattern, flags)
File "/usr/lib/python3.4/sre_compile.py", line 465, in compile
p = sre_parse.parse(p, flags)
File "/usr/lib/python3.4/sre_parse.py", line 746, in parse
p = _parse_sub(source, pattern, 0)
File "/usr/lib/python3.4/sre_parse.py", line 358, in _parse_sub
itemsappend(_parse(source, state))
File "/usr/lib/python3.4/sre_parse.py", line 695, in _parse
if not sourcematch(")"):
File "/usr/lib/python3.4/sre_parse.py", line 205, in match
self.__next()
File "/usr/lib/python3.4/sre_parse.py", line 196, in __next
raise error("bogus escape (end of line)")
sre_constants.error: bogus escape (end of line)
mydir = re.search(r':(.+)\\', mystring).group(1)
起作用。
为什么前面的两个示例不起作用?
在最后一个中,如果我使用了'r'前缀,为什么还需要两个反斜杠?
答案 0 :(得分:3)
您需要使用:
mydir = re.search(r':(.+)\\', mystring).group(1)
原始字符串r'\\'
的使用被解释为与单个反斜杠(所需)匹配的正则表达式,并允许您避免像':(.+)\\\\'
那样使用双转义。 双重转义是必要的,因为python字符串和regex解释器都给反斜杠赋予特殊含义(这就是您需要双重转义的原因)。
如果我使用了'r'前缀,为什么我需要两个反斜杠?
因为正则表达式解释器赋予反斜杠特殊的含义,所以要将其视为匹配字符,必须对其进行转义!
...有12个具有特殊含义的字符:反斜杠\, 尖号^,美元符号$,句点或点。,竖线或 管道符号|,问号?,星号或星号*,加号 符号+,左括号(,右括号), 开头的方括号[和开头的花括号{,这些特殊 字符通常称为“元字符”
因此,如果您想使用元字符作为匹配字符,则需要对其进行转义。