确定Python regex命名的组号?

2024-05-09 17:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,可以使用带有命名组的regex,例如:

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

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

^{pr2}$

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

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


Tags: name文本re名称match命名regex偏移量
3条回答

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

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

结果:

^{pr2}$

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

^{3}$

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

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

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

不清楚你想达到什么目的,但如果有帮助,这里有两个有用的东西:

  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")

    从现在起,您将有一个组名的唯一索引。

相关问题 更多 >