为什么这个python正则表达式不会编译?

Kir*_*odd 2 python regex

我有一个python脚本,使用以下正则表达式从我的代码中的NSLocalizedString宏中获取两个字符串(可能包含转义引号):

NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)
Run Code Online (Sandbox Code Playgroud)

它在RegexRx中工作正常并且完全符合预期...

RegexRx

...但是,当我尝试将它添加到我的python脚本中时...

localizedStringComment = re.compile('NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

...它失败并显示以下消息......

Traceback (most recent call last):
  File "../../localization_scripts/sr_genstrings.py", line 21, in <module>
    localizedStringComment = re.compile('NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: unexpected end of regular expression
Run Code Online (Sandbox Code Playgroud)

似乎python需要在某个地方进行额外的转移,但我不知道在哪里.如果我在线上的最后一对添加额外的反斜杠,就像这样......

localizedStringComment = re.compile('NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\\\]*)"\s*\)', re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

...它运行没有错误,但后来不匹配任何东西.任何帮助赞赏.

Mar*_*ers 7

使用原始字符串文字:

re.compile(r'NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

因为反斜杠在常规Python字符串中也有意义.原始字符串文字(带有前缀的字符串文字r)忽略Python支持的(大多数)转义序列.

请参阅Python正则表达式HOWTO中的反斜杠瘟疫.