【问题标题】:Combine multiple verbose python regex结合多个详细的python正则表达式
【发布时间】:2019-01-18 03:00:47
【问题描述】:

我希望通过组合较小的可重用模式来创建一些 python 正则表达式,并且我希望可重用模式使用详细标志。例如,假设我有一个简单的数字模式和一个小写字符模式,

DIGIT_PATTERN = re.compile(r"""
    (?P<my_digit_pattern>        # start named group
      \d+                        # 1 or more integers
    )                            # close named group
    """, re.VERBOSE)
CHAR_PATTERN = re.compile(r"""
    (?P<my_char_pattern>         # start named group
      [a-z]                      # a character
    )                            # close named group
    """, re.VERBOSE)

有没有一种方法可以创建由上述模式组成的新模式?有点像,

NEW_PATTERN = CHAR_PATTERN followed by DIGIT PATTERN followed by CHAR_PATTERN

我想匹配字符串a937267t。上面的例子被高度简化了,但重点是如何结合使用详细标志定义的正则表达式。

更新

这是我目前所拥有的……可能是唯一的方法……

NEW_PATTERN = re.compile(
    CHAR_PATTERN.pattern + 
    DIGIT_PATTERN.pattern + 
    CHAR_PATTERN.pattern,
    re.VERBOSE
)

我不得不放弃命名组 b/c 不能有两个组命名相同,但我认为这就是我想要的。

【问题讨论】:

  • 请记住,正则表达式语言允许您编写正则表达式来超越您实际匹配的内容,或者允许重复跳过匹配的部分。确实没有直接的方法可以将它们“添加”到彼此,您的解决方案也不适合它们。您对此的实际用例是什么?
  • 在re模块类Pattern中可能需要__add__...,不过没必要,不如在re.compile中一次性完成。 o(╯□╰)o
  • 我有大约十几个不同的“NEW_PATTERN”对象来定义 [NP0, ..., NP11]。 NP 对象的某些组成部分是相同的,如果我确定 CHAR_PATTERN 错误或需要更新,我不想在多个地方更改代码。

标签: python regex


【解决方案1】:
NEW_PATTERN = re.compile(r"""
    (?P<my_new_pattern>         # start named group
      [a-z]                      # a character
      \d+                        # 1 or more integers
      [a-z]                      # a character
    )                            # close named group
    """, re.VERBOSE)

【讨论】:

  • 我举了一个高度简化的例子。我意识到我可以内联它们,但这就是我试图避免的。想象一下 DIGIT_PATTERN 和 CHAR_PATTERN 各有 40 行长,而且有几十行。
  • 老实说理解起来有点困难,但听起来你想在代码中构建正则表达式而不是输入它:my_regex = '[a-z]\d+' * 40 然后NEW_PATTERN = re.compile(my_regex, re.VERBOSE)
  • 是的,我可以更好地解释它,我现在有一个工作示例......可能是可以做到的最好的。我将通过底部的编辑来更新主帖
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2015-01-14
  • 2016-07-30
相关资源
最近更新 更多