Извлечение содержимого МЕЖДУ регулярными выражениями python?

#python #regex #parsing #matching #text-extraction

#python #регулярное выражение #синтаксический анализ #сопоставление #извлечение текста

Вопрос:

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

  SOME TEXT [SOME MORE TEXT] value="ssss" SOME MORE TEXT
 

Мое регулярное выражение:

  compiledRegex = re.compile('[.*] value=("|').*("|')')
 

Очевидно, что это вернет все [ЕЩЕ НЕМНОГО ТЕКСТА] value=»ssss», однако я хочу, чтобы возвращались только ssss, поскольку это то, что я ищу

Очевидно, я могу определить функцию синтаксического анализатора, но мне кажется, что python предоставляет какой-то простой pythonic способ выполнения такой задачи

Комментарии:

1. Ваше регулярное выражение ошибочно. Это будет соответствовать value="foo' , и value='bar" вы почти наверняка не хотите этого делать. Вместо этого вы должны использовать это : r'''[.*] value=("|')(.*?)1''' . Обратите внимание, что использование строки в тройных кавычках устраняет необходимость экранирования «‘». Кроме того, рекомендуется всегда использовать необработанные строки (например, r’foo’ и r»bar») при работе с регулярными выражениями в Python.

Ответ №1:

Это то, для чего предназначены группы захвата.

 compiledRegex = re.compile('[.*] value=(?:"|')(.*)(?:"|')') 
matches = compiledRegex.match(sampleText)
capturedGroup = matches.group(1) # grab contents of first group
 

?: Внутри старых групп (круглые скобки) означает, что группа теперь является группой без захвата; то есть в результате она не будет доступна как группа. Я преобразовал их, чтобы упростить вывод, но вы можете оставить их как группы захвата, если хотите (но тогда вам придется использовать matches.group(2) вместо этого, поскольку первая цитата будет первой захваченной группой).

Ответ №2:

Ваше исходное регулярное выражение слишком жадное: r'.*]' не остановится на первом ']' , а второе '.*' не остановится '"' . Чтобы остановиться, c вы могли бы использовать [^c] или '.*?' :

 regex = re.compile(r"""[[^]]*] value=("|')(.*?)1""") 
 

Пример

 m = regex.search("""SOME TEXT [SOME MORE TEXT] value="ssss" SOME MORE TEXT""")
print m.group(2)