【问题标题】:regex named group if exist正则表达式命名组(如果存在)
【发布时间】:2018-10-04 07:10:59
【问题描述】:

早上好,

我有一个字符串,我需要解析和打印两个命名组的内容,知道其中一个可能不存在。

字符串看起来像这样(基本上是 /proc/pid/cmdline 的内容):

"""
<some chars with letters / numbers / space / punctuation> /CLASS_NAME:myapp.server.starter.StarterHome /PARAM_XX:value_XX /PARAM_XX:value_XX /CONFIG_FILE:myapp.server.config.myconfig.txt /PARAM_XX:value_XX /PARAM_XX:value_XX /PARAM_XX:value_XX <some chars with letters / numbers / space / punctuation>
"""

我的流程有几乎相同的模式,即:

/CLASS_NAME:myapp.server.starter.StarterHome 始终存在,但 /CONFIG_FILE:myapp.server.config.myconfig.txt 并不总是存在。

我正在使用带有re 模块的python2 来捕获值。到目前为止,我的模式看起来像这样,我能够捕捉到与/CLASS_NAME对应的我想要的值

re.compile('CLASS_NAME:\w+\W\w+\W\w+\W(?P<class>\w+)')

因为/CONFIG_FILE 存在与否,我在myregexp 中添加了以下内容:

re.compile(r"""CLASS_NAME:\w+\W\w+\W\w+\W(?P<class>\w+).*?
               (CONFIG_FILE:\w+\W\w+\W\w+\W(?P<cnf>\w+.txt))?
            """, re.X)

我的理解是我的rexexp 的第二部分是可选的,因为整个部分在括号之间,后跟?

不幸的是,我的假设是错误的,因为它无法捕捉到它

我也尝试删除第一个?,但没有帮助。

我通过PYTHEX 尝试了几次,试图理解我的正则表达式,但找不到解决方案。

任何人有什么建议可以解决我的问题吗?

【问题讨论】:

    标签: python regex grouping named


    【解决方案1】:

    您可以将整个可选部分包装在一个可选的非捕获组中,并为CONFIG_FILE 强制设置捕获组:

    re.compile(r"""CLASS_NAME:(?:\w+\W+){3}(?P<class>\w+)(?:.*?
                   (CONFIG_FILE:(?:\w+\W+){3}(?P<cnf>\w+\.txt)))?
            """, re.X)
    

    如果有换行符,请使用re.X | re.S 修饰符选项。请注意,\w+\W\w+\W\w+\W 最好写成(?:\w+\W+){3}

    regex demo

    主要区别是(?:.*?(CONFIG_FILE:(?:\w+\W+){3}(?P&lt;cnf&gt;\w+\.txt)))?部分:

    • (?: - 可选的开始(因为后面有一个贪婪的? 量词)非捕获组匹配
      • .*? - 任何 0+ 个字符,尽可能少
      • (CONFIG_FILE:(?:\w+\W+){3}(?P&lt;cnf&gt;\w+\.txt)) - 匹配
        • CONFIG_FILE: - 文字子串
        • (?:\w+\W+){3} - 三个 1+ 单词字符序列,后跟 1+ 非单词字符
        • (?P&lt;cnf&gt;\w+\.txt) - 组 cnf:1+ 字字符,一个点(注意它应该被转义),然后是 txt
    • )? - 可选非捕获组的结尾(将尝试一次)

    【讨论】:

    • 非常感谢 Wiktor,它对我帮助很大
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2010-09-29
    相关资源
    最近更新 更多