У меня есть (возможно) файл определения с разделением строк, который имеет следующий аналогичный шаблон:
group-definition "first-regex" "second-regex"
оба подрегулярных выражения являются фактическими регулярными выражениями, и мне нужно проверить «основной» синтаксис. Возврат Python должен дать мне следующие данные:
Кроме того, определения вложенных регулярных выражений могут использовать как одинарные, так и двойные кавычки, поэтому следующий синтаксис также может быть правильным:
definition "first-regex.*" 'second-regex[0-9]' #some comment
Мне также нужно выяснить, правильный ли синтаксис, чтобы следующая строка не была распознана как правильная:
something-right "something wrong' 'really-\.wrong" wtf
Это потому, что мне нужно 2 регулярных выражения для последующей обработки и без добавления каких-либо дополнительных данных (если это не комментарий, начинающийся как с «#», так и с «;»).
К сожалению, мой опыт работы с регулярными выражениями не так велик, но я знаю, что использование чего-то подобного не будет работать должным образом:
[\.]* (\".+?\")|(\'.+?\')[\ ](\".+?\")|(\'.+?\')
Я предполагаю, что мне нужно более глубокое знание того, как работают подгруппы регулярных выражений, но я пока не смог понять, как их правильно сделать.
Я знаю, что есть много вопросов и ответов на эту тему, но мне не удалось найти правильный поисковый контекст для такого рода проблем.
Вы на правильном пути. Я предполагаю, что все следующие утверждения являются допустимыми
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']
Прочтите документация для получения дополнительной информации
Это именно то, что мне было нужно, я знал только об именованных захватах, но никогда ими не пользовался. Большое спасибо!