Разделить несколько (вложенных) определений под-регулярных выражений Python - PullRequest
3 голосов
/ 09 апреля 2019

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

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

оба под-регулярные выражения являются действительными регулярными выражениями, и мне нужно проверить синтаксис "main".Возвращение Python должно дать мне следующие данные:

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

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 09 апреля 2019

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

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, как было сказано ранее, позволит вам сопоставить новые строки в подгруппах перерыва. finditer - очень полезный инструмент для многократного сопоставления, поскольку он найдет все непересекающиеся совпадения и даст совпадения.

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

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

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

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