Regex назвал группировку - PullRequest
       5

Regex назвал группировку

0 голосов
/ 22 октября 2010

Можете ли вы иметь динамическое именование в группах регулярных выражений? Что-то вроде

reg = re.compile(r"(?PText|Or|Something).*(?PTextIWant)")

r = reg.find("TextintermingledwithTextIWant")

r.groupdict()["Text"] == "TextIWant"

Чтобы в зависимости от того, что было в начале, группа ["Текст"] == TextIWant

Обновлено, чтобы сделать вопрос более понятным.

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Ваш вопрос сформулирован довольно забавно, но я думаю, что вы ищете группу без захвата. Сделай так:

(?:Must_Match_This_First)What_You_Want(?:Must_Match_This_Last)

?: - это то, что обозначает, что группа соответствует, но не захватывает.

1 голос
/ 22 октября 2010

Некоторые движки регулярных выражений поддерживают это, некоторые нет. Этот сайт говорит, что Perl, Python, PCRE (и, следовательно, PHP) и .NET поддерживают его, все с немного другим синтаксисом:

+--------+----------------------------+----------------------+------------------+
| Engine |           Syntax           |    Backreference     |     Variable     |
+--------+----------------------------+----------------------+------------------+
| Perl   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | %+{name}         |
|        | (?P<name>...)              | \g{name}, (?&name)*  |                  |
|        |                            | (?P>name)*           |                  |
+--------+----------------------------+----------------------+------------------+
| Python | (?P<name>...)              | (?P=name), \g<name>  | m.group('name')  |
+--------+----------------------------+----------------------+------------------+
| .NET   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | m.Groups['name'] |
+--------+----------------------------+----------------------+------------------+
| PCRE   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | Depends on host  |
|        | (?P<name>...)              | \g{name}, \g<name>*  | language.        |
|        |                            | \g'name'*, (?&name)* |                  |
|        |                            | (?P>name)*           |                  |
+--------+----------------------------+----------------------+------------------+

Это не полный список, но это то, что я мог найти.Если вы знаете больше ароматов, добавьте их!Формы обратной ссылки с * - это формы, которые являются "рекурсивными", а не просто обратной ссылкой;Я считаю, что это означает, что они снова соответствуют шаблону , а не тому, что соответствует шаблону .Кроме того, я пришел к этому, прочитав документы, но вполне могут быть ошибки - это включает в себя некоторые языки, которые я никогда не использовал, и некоторые функции, которые я никогда не использовал.Дайте мне знать, если что-то не так.

0 голосов
/ 22 октября 2010

Вы можете сначала построить строку динамически, а затем передать ее движку Regex.

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