Python:正则表达式和带有包含反斜杠的字符串的组

时间:2018-11-22 18:53:32

标签: python regex python-3.x

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'前缀,为什么还需要两个反斜杠?

1 个答案:

答案 0 :(得分:3)

您需要使用:

mydir = re.search(r':(.+)\\', mystring).group(1)

原始字符串r'\\'的使用被解释为与单个反斜杠(所需)匹配的正则表达式,并允许您避免像':(.+)\\\\'那样使用双转义。 双重转义是必要的,因为python字符串和regex解释器都给反斜杠赋予特殊含义(这就是您需要双重转义的原因)。

  

如果我使用了'r'前缀,为什么我需要两个反斜杠?

因为正则表达式解释器赋予反斜杠特殊的含义,所以要将其视为匹配字符,必须对其进行转义!

来自Regex documentation

  

...有12个具有特殊含义的字符:反斜杠\,   尖号^,美元符号$,句点或点。,竖线或   管道符号|,问号?,星号或星号*,加号   符号+,左括号(,右括号),   开头的方括号[和开头的花括号{,这些特殊   字符通常称为“元字符”

因此,如果您想使用元字符作为匹配字符,则需要对其进行转义。