如何创建包含变量和注释的正则表达式?

时间:2019-03-30 00:05:46

标签: python regex windows

我想创建一个包含评论和变量的正则表达式。我以为我会像这样拆分字符串,但这是行不通的:

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 个答案:

答案 0 :(得分:4)

将您的正则表达式模式分成多个字符串,然后用"".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)

答案 1 :(得分:0)

您的串联符号和该模式第二行的引号中的引号(''')已与注释一起注释掉;只需将其移到评论前面即可。
我将两个加号放在一行上,但是您仍然可以将它们分成多个,这只是我的偏好...

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标志可以使它们成为实际注释。