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

Python 如何创建包含变量和注释的正则表达式?,python,regex,windows,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

我想创建一个包含注释和变量的正则表达式。我想我会像这样把绳子分开,但它不起作用:

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) 

将正则表达式模式分解为多个字符串,然后使用.join将它们组合成单个字符串,如下所示

为了避免注释的需要,您可以为正则表达式的每个部分使用描述性变量名。通过这种方式,将行定位字符与正则表达式的业务逻辑分离以使这些变量更加可重用也可能是有意义的

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)

将正则表达式模式分解为多个字符串,然后使用.join将它们组合成单个字符串,如下所示

为了避免注释的需要,您可以为正则表达式的每个部分使用描述性变量名。通过这种方式,将行定位字符与正则表达式的业务逻辑分离以使这些变量更加可重用也可能是有意义的

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)

您的连接符号和模式第二行的结束引号“已随注释一起注释掉;只需将它们移动到评论前面即可。 我把两个加号放在一行上,但你仍然可以把它们分成多个加号,这只是我的偏好

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标志会使他们产生实际的注释。

您的连接符号和模式第二行上的结束引号与您的注释一起被注释掉;只需将它们移动到评论前面即可。 我把两个加号放在一行上,但你仍然可以把它们分成多个加号,这只是我的偏好

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

完美!谢谢。如果此答案对您有帮助,请单击绿色复选标记将其标记为已接受答案。这表明其他社区成员的答案是有用的,并且可能有很大的机会帮助他们。太好了!谢谢。如果此答案对您有帮助,请单击绿色复选标记将其标记为已接受答案。这向其他社区成员表明,该答案很有用,并且可能对他们也有很大帮助。此答案中的正则表达式与问题中的预期模式不匹配,因为它包含文本字符串版本号和pdf扩展名。@Emmett J.Butler re.VERBOSE向他们发表评论,不管SO上可能显示什么语法。在测试字符串上运行它,如sm12345-a-21some_doctypev3-3.pdf,doctype='some_doctype'。此答案中的正则表达式与问题中的预期模式不匹配,因为它包含文本字符串版本号和pdf扩展名。@Emmett J.Butler re.VERBOSE会对它们进行注释,不管SO上显示什么语法。在测试字符串上运行它,如sm12345-a-21some_doctypev3-3.pdf,doctype='some_doctype'