Как мне создать регулярное выражение, содержащее переменную и комментарии? - PullRequest
1 голос
/ 30 марта 2019

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

import re

regex = re.compile(r'''
        ^(sm\d{5}-[a-z]+-\d{2})          # study number''' + 
        doctype               +      r'''# document
        v(\d+)-(\d+)                     # version number
        \.pdf$                           # pdf extension
        ''', re.VERBOSE) 

Ответы [ 2 ]

4 голосов
/ 30 марта 2019

Разбейте ваш шаблон регулярного выражения на несколько строк, затем объедините их в одну строку с помощью "".join(), например,

import re
pattern = "".join([
    "^(sm\d{5}-[a-z]+-\d{2})",  # study number
    doctype,  # document
    "v(\d+)-(\d+)",  # version number
    "\.pdf$",  # pdf extension
])
regex = re.compile(pattern, re.VERBOSE)

Чтобы избежать необходимости в комментариях, вы можете использовать описательные имена переменных для каждого разделарегулярного выраженияДелая это таким образом, также может иметь смысл отделить символы позиционирования строки от «бизнес-логики» вашего регулярного выражения, чтобы сделать эти переменные более пригодными для повторного использования.

study_number_pattern = "(sm\d{5}-[a-z]+-\d{2})"
version_number_pattern = "v(\d+)-(\d+)"
pdf_extension_pattern = "\.pdf"
pattern = "".join([
    "^",
    study_number_pattern,
    doctype,
    version_number_pattern,
    pdf_extension_pattern,
    "$"
])
regex = re.compile(pattern, re.VERBOSE)
0 голосов
/ 30 марта 2019

Ваш знак конкатенации и закрывающий блок кавычек ('' ') во второй строке шаблона были закомментированы вместе с вашей запиской;просто переместите их перед комментарием.
Я поместил оба знака плюс в одну строку, но вы все равно можете разделить их на несколько, это просто мое предпочтение ...

regex = re.compile(r'''
        ^(sm\d{5}-[a-z]+-\d{2})'''   # study number
        + doctype +                  # document
        r'''v(\d+)-(\d+)             # version number
        \.pdf$                       # pdf extension
        ''', re.VERBOSE)

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

Редактировать:
Подсветка синтаксиса переполнения стека создает впечатление, будто строки с комментариями «номер версии» и «расширение PDF» являются частью шаблона вприведенный выше код, но использование флага re.VERBOSE делает их реальными комментариями.

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