2

我有一个带有以下正则表达式的 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)

...它运行时没有错误,但随后不匹配任何内容。任何帮助表示赞赏。

4

2 回答 2

7

使用原始字符串文字:

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

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

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

于 2013-07-26T13:43:28.237 回答
2

尝试

localizedStringComment = re.compile(r'NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)', re.DOTALL)

注意正则表达式字符串前面的小 r。这表明它是一个原始字符串。(另见http://docs.python.org/2/library/re.html#module-re

于 2013-07-26T13:45:37.470 回答