2013-07-26 1 views
2

У меня есть питон скрипт со следующим регулярным выражением, чтобы захватить две строки (которые могут содержать кавычки экранированы) из NSLocalizedString макросов в моем коде:Почему не будет компилироваться это регулярное выражение python?

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

Он отлично работает в RegexRx точно соответствует, как ожидалось ...

RegexRx

... однако, когда я пытаюсь добавить его в мой питон скрипт, как это ...

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 

Похоже, что потребности питона дополнительного побега где-то, но я понятия не имею, где. Если добавить дополнительные обратные слэши к последней паре на линии, как это ...

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

... он работает без ошибок, но тогда ничего не найдено. Любая помощь оценивается.

ответ

7

Используйте необработанный строковый литерал:

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

, потому что обратные косые имеют смысл в обычной строке Python слишком. Строковый литерал (строковый литерал с префиксом r) игнорирует (большинство) escape-последовательности, поддерживаемые Python.

См. The Backslash Plague в Python Regular Expression HOWTO.

+0

Вы слишком быстро ;-) – Ludo

2

Попытка

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

Обратите внимание на малых г в передней части строки регулярных выражений. Это означает, что это необработанная строка. (См. Также http://docs.python.org/2/library/re.html#module-re)

Смежные вопросы