Regex из .NET в Python - PullRequest
       9

Regex из .NET в Python

0 голосов
/ 11 октября 2009

У меня есть регулярное выражение, которое прекрасно работает (хотя я уверен, что оно слабое) в .NET / C #:

((^|\s))(?<tag>\@(?<tagname>(\w|\+)+))(?($|\s|\.))

Я пытаюсь переместить его на Python, но, похоже, у меня возникла проблема с форматированием (исключение недопустимого выражения).

Это неубедительный вопрос / просьба, но я некоторое время смотрел на это, но ничего очевидного на меня не бросалось.

Примечание: я просто пытаюсь

r = re.compile('((^|\s))(?<tag>\@(?<tagname>(\w|\+)+))(?($|\s|\.))')

Спасибо, Скотт

Ответы [ 2 ]

1 голос
/ 11 октября 2009

Есть некоторые синтаксические несовместимости между регулярными выражениями .NET и регулярными выражениями PCRE / Python:

  • (?<name>...) - это (?P<name>...)
  • (?...) не существует, и, поскольку я не знаю, для чего он используется в .NET, я не могу угадать какой-либо эквивалент. Поиск кода Google не дает мне указателя на то, для чего он может быть использован.

Кроме того, вы должны использовать необработанные строки Python (r"I am a raw string") вместо обычных строк при выражении регулярных выражений: необработанные строки не интерпретируют escape-последовательности (например, \n). Но это не проблема в вашем примере, поскольку вы не используете какую-либо известную escape-последовательность, которую можно заменить (\s ничего не означает как escape-последовательность, поэтому она не заменяется).

0 голосов
/ 11 октября 2009

Есть "(?" Для предотвращения создания отдельной группы? В Python это "(:?". Попробуйте это:

r = re.compile(r'((^|\s))(:?<tag>\@(:?<tagname>(\w|\+)+))(:?($|\s|\.))')

Также обратите внимание на использование необработанного строкового литерала (символ "r" непосредственно перед кавычками). Необработанные литералы подавляют экранирование '\', поэтому ваши '\' символы проходят прямо через re (в противном случае вам потребуется '\\' для каждого '\').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...