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

标签 python regex

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

NSLocalizedString\(@"(?:\\.|[^"\\]*)",\s*@"(?:\\.|[^"\\]*)"\s*\)

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

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)

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

最佳答案

使用原始字符串文字:

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

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

参见 The Backslash Plague在 Python 正则表达式 HOWTO 中。

关于python - 为什么这个 python 正则表达式不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882893/

相关文章:

python - pandas.DataFrame.loc ,在新列中标记数据

regex - 如何仅对包含大写字母的单词进行grep

ruby - 每行一个html标签的正则表达式

python - 对 TarInfo 列表进行排序

python - 如何在具有 569 行(样本)和 30 列(特征)的数据矩阵上初始化 K 表示聚类?

python - 如何使用 PIL 使所有白色像素透明?

python - 获取本 [week/month/quarter/year] 最后一天的日期

regex - 仅否定正则表达式中的特定字符串

javascript - 匹配字符串或行尾的正则表达式

r - 获取第一个空格之前的字符