【问题标题】:pattern matching regex callbacks模式匹配正则表达式回调
【发布时间】:2021-04-26 12:25:18
【问题描述】:

我有许多正则表达式模式和文本,我需要在其上匹配模式。

最简单的方法,我可以通过 for 循环遍历它们并检查谁匹配。 但在我看来,这是无效的。 我试图将所有模式连接成一个模式(使用或运算符)

我的正则表达式:

/image/(\d+)
/report/(\d+)/(\d+)/(\d+)

(?P<match1>/image/(\d+))|(?P<match2>(/report/(\d+)/(\d+)/(\d+)))

它有效,但是我需要检查 match1 或 match2 是否不是“无”,我想知道是否有办法通过查找表来改进它。

谢谢

【问题讨论】:

  • 听起来好像不需要命名的捕获组。事实上,您不需要任何捕获组:/image/\d+|/report/\d+/\d+/\d+
  • 您的正则表达式的目的是验证或提取数据吗?
  • 验证数据
  • 好的,所以我的评论是相关的。
  • 我需要,因为我想知道哪个模式匹配

标签: python regex


【解决方案1】:

如果您使用命名的捕获组,您可以查看groupdict()

返回包含匹配的所有命名子组的字典, 由子组名称键入。默认参数用于组 没有参加比赛的;它默认为无。

注意,如果您使用的模式可能具有相同的匹配项,则第一个模式会由于交替而匹配。

如果您想知道所有匹配的模式,我认为您仍然必须使用循环来测试所有模式。

要仅获取匹配项,您不必在数字周围使用单独的捕获组。

(?P<match1>/image/\d+)|(?P<match2>/report/\d+/\d+/\d+)

使用 groupdict() 的示例:

import re

pattern = r"(?P<match1>/image/\d+)|(?P<match2>/report/\d+/\d+/\d+)"
s = "/image/5"
m = re.search(pattern, s)

if m:
    print(m.groupdict())

输出

{'match1': '/image/5', 'match2': None}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2016-04-20
    • 2014-09-15
    相关资源
    最近更新 更多