【问题标题】:Determine Python regex named group numbers?确定 Python 正则表达式命名的组号?
【发布时间】:2015-09-14 14:41:53
【问题描述】:

在 Python 中,您可以使用带有命名组的正则表达式,例如:

m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")

您可以按名称或使用groupdict 查找命名组的匹配文本:

In [202]: m.group("first_name")
Out[202]: 'Malcolm'

In [203]: m.groupdict()
Out[203]: {'first_name': 'Malcolm', 'last_name': 'Reynolds'}

如果我想要命名组的偏移量,我需要知道它们是哪个组号,所以我可以使用start(1) 之类的东西。如何找出命名组及其组号之间的映射?如果它们匹配相同的字符串,则无法明确推断。

这样做的目的是能够在对原始正则表达式没有特定知识的函数中推断出命名的带注释跨度(带有偏移量)。

【问题讨论】:

  • 字典是无序的,所以这没有多大意义。你想达到什么目的?
  • 组有偏移不是吗?如何找到命名组的偏移量?

标签: python regex


【解决方案1】:

如果您使用已编译的正则表达式,您可以获得组名到索引的映射。 像这样:

p = re.compile(r"(?P<first_name>\w+) (?P<last_name>\w+)")
print(p.groupindex)

结果:

{'first_name': 1, 'last_name': 2}

或者您可以通过re 属性从匹配中访问模式对象:

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> print(m.re.groupindex)
{'first_name': 1, 'last_name': 2}

【讨论】:

    【解决方案2】:

    请注意,您可以将组名提供给start 而不是索引。

    >>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
    >>> m.start('last_name')
    8
    

    因此,您可能不需要将组名映射到其索引。

    【讨论】:

      【解决方案3】:

      不清楚您要达到的目标,但如果有帮助,这里有 2 点有用的东西:

      1. 匹配对象m 有一个groups 方法,它将向匹配的字符串返回一个元组。您可以使用整数偏移量。
      2. 首先定义组名元组:

        group_names = ("first_name", "last_name")

        然后使用字符串格式化函数创建re:

        m = re.match(r"(?P&lt;{0}&gt;\w+) (?P&lt;{1}&gt;\w+)".format(*group_names), "Malcolm Reynolds")

        从现在开始,您将拥有 group_names 的唯一索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多