Странные проблемы с Python Regex - PullRequest
0 голосов
/ 04 апреля 2011
whitespace_pattern = u"\s" # bug: tried to use unicode \u0020, broke regex

time_sig_pattern = \
    """^%(ws)s*time signature:%(ws)s*(?P<top>\d+)%(ws)s*\/%(ws)s*(?P<bottom>\d+)%(ws)s*$""" %{"ws": whitespace_pattern}


time_sig         = compile(time_sig_pattern,         U|M)

По какой-то причине добавление подробного флага X для компиляции нарушает шаблон.

Кроме того, я хотел использовать Unicode для распознавания whitespace_pattern (предположительно, мы получим шаблоны, которые используют не-Unicode пробелы, и нам нужно явно проверить этот единственный символ Unicode в качестве допустимого пространства), но шаблонпродолжает ломаться

Ответы [ 3 ]

1 голос
/ 04 апреля 2011

VERBOSE дает вам возможность писать комментарии в своем регулярном выражении для документирования.

Для этого игнорируются пробелы, поскольку для написания комментариев необходимо использовать разрывы строк.

Замените все пробелы в регулярном выражении на \s, чтобы указать, что это пробелы, которым вы хотите соответствовать в вашем шаблоне, а не просто пробелы для форматирования ваших комментариев.

Более того, вы можете использовать префикс r для строки, которую вы используете в качестве шаблона. Он говорит Python не интерпретировать специальные нотации, такие как \n, и позволяет использовать обратную косую черту без их экранирования.

0 голосов
/ 04 апреля 2011

При создании регулярного выражения для сопоставления символов Unicode вы не хотите использовать строку Unicode Python. В вашем примере регулярное выражение должно видеть буквенные символы \u0020, поэтому вы должны использовать whitespace_pattern = r"\u0020" вместо u"\u0020".

Как уже упоминалось в других ответах, вы также должны использовать префикс r для time_sig_pattern, после этих двух изменений ваш код должен работать нормально.

Для правильной работы VERBOSE необходимо убрать все пробелы в шаблоне, поэтому в начале шаблона замените пространство в time signature на "\ " (кавычки для ясности), \s или [ ] как задокументировано здесь .

0 голосов
/ 04 апреля 2011

Всегда определяйте регулярные выражения с префиксом r, чтобы указать, что это необработанные строки.

 r"""^%(ws)s*time signature:%(ws)s*(?P<top>\d+)%(ws)s*\/%(ws)s*(?P<bottom>\d+)%(ws)s*$""" %{"ws": whitespace_pattern}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...