Разделить несколько (вложенных) определений регулярных выражений python

У меня есть (возможно) файл определения с разделением строк, который имеет следующий аналогичный шаблон:

group-definition "first-regex" "second-regex"

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

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

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

definition "first-regex.*" 'second-regex[0-9]' #some comment

Мне также нужно выяснить, правильный ли синтаксис, чтобы следующая строка не была распознана как правильная:

something-right "something wrong' 'really-\.wrong" wtf

Это потому, что мне нужно 2 регулярных выражения для последующей обработки и без добавления каких-либо дополнительных данных (если это не комментарий, начинающийся как с «#», так и с «;»).

К сожалению, мой опыт работы с регулярными выражениями не так велик, но я знаю, что использование чего-то подобного не будет работать должным образом:

[\.]* (\".+?\")|(\'.+?\')[\ ](\".+?\")|(\'.+?\')

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы на правильном пути. Я предполагаю, что все следующие утверждения являются допустимыми

definition 'regex1' "regex2"
definition   # Comment
    'regex1' # Comment
    'regex2'

Возможно, вы захотите изучить именованные захваты. ваш шаблон должен допускать комментарии или пробелы между каждым аргументом. И вы должны помнить об использовании флага re.S, который позволит вам захватить '\n' с '.'

import re

pattern = """(?P<definition>[\w\-]+)    # Your definition equivalent to [a-zA-Z\-_]
             (?P<break1>(\s|#.*?\n)*?)  # Optional to match comments and spaces
             (?P<reg1>\'.*?\'|\".*?\")  # Regex pattern1
             (?P<break2>(\s|#.*?\n)*?)  # Another optional break
             (?P<reg2>\'.*?\'|\".*?\")  # Pattern2 """

with open('your_document', 'r') as f:
     for match in re.finditer(pattern, f.read(), re.X | re.S):
         # do something with each match

re.X позволяет шаблону быть подробным. re.S, как было сказано ранее, позволит вам сопоставлять новые строки в подгруппах разрыва. находщик — очень полезный инструмент для многократных сопоставлений, поскольку он находит все непересекающиеся совпадения и выдает совпадения.

(?P<name>pattern) позволяет получать доступ к субзахватам по имени. Таким образом, вы можете получить к ним доступ,

match['definintion']
match['reg1']
match['reg2']

Прочтите документация для получения дополнительной информации

Это именно то, что мне было нужно, я знал только об именованных захватах, но никогда ими не пользовался. Большое спасибо!

musicamante 09.04.2019 22:14

Другие вопросы по теме