我有一个带有以下正则表达式的python脚本,可以从我的代码中的NSLocalizedString宏中获取两个字符串(可能包含转义引号):
NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)
它在RegexRx中运行正常,并且与预期完全匹配...
...但是,当我尝试将它添加到我的python脚本中时......
localizedStringComment = re.compile('NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
...它失败并显示以下消息......
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
似乎python需要在某处进行额外的转义,但我不知道在哪里。如果我在线上的最后一对添加额外的反斜杠,就像这样......
localizedStringComment = re.compile('NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\\\]*)"\s*\)', re.DOTALL)
...它运行没有错误,但后来没有匹配任何东西。任何帮助表示赞赏。
答案 0 :(得分:7)
使用原始字符串文字:
re.compile(r'NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
因为反斜杠在常规Python字符串中也有意义。原始字符串文字(前缀为r
的字符串文字)忽略了Python支持的(大多数)转义序列。
请参阅Python正则表达式HOWTO中的The Backslash Plague。
答案 1 :(得分:2)
尝试
localizedStringComment = re.compile(r'NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)
注意正则表达式字符串前面的小r。这表明它是一个原始字符串。 (另见http://docs.python.org/2/library/re.html#module-re)