Regex необязательный порядок захвата группы - PullRequest
0 голосов
/ 22 мая 2018

У меня есть простой, но сложный вопрос о регулярных выражениях (использующий в python), на который я не нашел ответа нигде здесь, в Google.Есть ли какая-нибудь «хитрость», как сделать две группы захвата в необязательном порядке?Допустим, у нас есть следующее:

.*abc.*

То, что я хочу, это также соответствует этому:

.*acb.*

Я знаю, что могу использовать

.*abc|acb.*

, но проблемав том, что если у нас есть что-то более сложное, чем abc, код очень длинный.Нет ли обходного пути, чтобы сказать, например, «сопоставить последние две группы захвата (или символы и т. Д.) В любом порядке?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

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

[cdgjow]

Конечно этот пример относится к символам.

Альтернативные последовательности должны быть указаны с использованием "|".Пример:

abc|cba

Нет способа выразить то, что вы хотели бы выразить в классическом синтаксисе регулярного выражения. Синтаксис регулярного выражения не имеет синтаксических элементов для выражения того, что вы хотели бы выразить,Этого не хватает этой функции.Вы должны полагаться на «вручную», указав свои альтернативы.Это не предел автомата, созданного из регулярных выражений, а сам синтаксис регулярного выражения.

Это означает: вам нужно будет создать требуемое вами регулярное выражение со всеми возможными вариантами.Есть два способа сделать это:

  • Сделайте это вручную.Не торопитесь, будьте осторожны, создайте правильное регулярное выражение вручную.
  • Сделайте это программно.Напишите некоторый код, который генерирует необходимое вам регулярное выражение.

Если вы сделаете это вручную, рассмотрите ответ @TamasRev.(Спасибо @TamasRev! Хороший ответ!) Но на вашем месте я бы построил регулярное выражение программно.(Для подобных вещей программирование было придумано так или иначе :-))

0 голосов
/ 22 мая 2018

Я действительно не понимаю, что это за вещь в любом порядке, которая сделала бы регулярное выражение короче.С другой стороны, я могу показать вам, как сделать это читабельным, даже если у вас есть тонна вариантов.

import re
pattern = """
.*      # match from starting the line
(?:     # A non-capturing group starts so we can list lots of alternatives
abc|    # alternative 1
acb     # alternative 2
)       # end of alternatives
.*      # then match everything up to the end of the line
"""
re.search(pattern, 'qqabcqq', re.VERBOSE) # returns a match
re.search(pattern, 'qqacbqq', re.VERBOSE) # returns a match
re.search(pattern, 'qqaSDqq', re.VERBOSE) # does not return a match

Так что же мы только что увидели здесь?

""" ... """Конструкция - это удобный способ определения многострочных строк в Python.

Затем re.VERBOSE пропускает пробелы и комментарии.Как указано в , в руководстве указано: :

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

Это две вещиПозвольте вам добавить структуру и комментарии к вашему регулярному выражению. Здесь - еще один замечательный пример.

...