确定名为组号的Python正则表达式?

时间:2015-09-14 14:41:53

标签: python regex

在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)之类的东西。如何找出命名组与其组号之间的映射?如果它们匹配相同的字符串,则无法明确推断。

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

3 个答案:

答案 0 :(得分:4)

如果使用编译的正则表达式,则可以将组名称转换为索引映射。 像这样:

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}

答案 1 :(得分:2)

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

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

因此,您可能没有必要将组名映射到其索引。

答案 2 :(得分:0)

不清楚你想要实现的目标,但如果它有所帮助,这里有两个有用的东西:

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

    group_names = ("first_name", "last_name")

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

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

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