【问题标题】:Extracting groups in a regex match在正则表达式匹配中提取组
【发布时间】:2018-04-16 15:49:38
【问题描述】:

我有一组输入。 我正在尝试编写一个正则表达式来匹配输入中的以下模式:

时间位置

示例输入:

今天12:30 PM山姆的客厅

文本的粗体部分在每个输入中有所不同。

我写了以下正则表达式:

import regex as re

input_example = "Today at 12:30 PM on Rakesh's Echo"
regexp_1 = re.compile(r'(\w+) at (\d+):(\d+) (\w+) on (\w+)')
re_match = regexp_1.match(input_example)

哪个有效,我匹配正确的模式。我现在正试图从模式中提取组。

我想要的输出是:

re_match.group(1)
>> "Today"
re_match.group(2)
>> "12:30 PM"
re_match.group(3)
>> "Sam's living room"

但是,我当前的正则表达式匹配没有给我这个输出。能给我上述输出的正确正则表达式是什么?

【问题讨论】:

  • 当你说它没有给出那个输出时,它实际上给出了什么输出?我可以想象第三组只是“山姆”,但还有什么?

标签: python regex


【解决方案1】:

您可以创建嵌套组,但这样会不太可读,因为您必须计算组的确切编号,然后您会忘记该编号的确切含义。

最好使用命名组。这是从 REPL 复制的:

>>> import re
... 
... input_example = "Today at 12:30 PM on Rakesh's Echo"
... regexp_1 = re.compile(r'(?P<day>\w+) at (?P<time>(\d+):(\d+) (\w+)) on (?P<place>\w+)')
... re_match = regexp_1.match(input_example)
>>> list(re_match.groups())
['Today', '12:30 PM', '12', '30', 'PM', 'Rakesh']
>>> re_match.group('day')
'Today'
>>> re_match.group('time')
'12:30 PM'
>>> re_match.group('place')
'Rakesh'

【讨论】:

    【解决方案2】:

    你很接近。你只是想稍微调整一下你的捕获组看起来像......

    re.compile(r"(\w+) at (\d+:\d+ \w+) on (.+)")

    请注意,第二个捕获组现在将匹配完整的 hour:minute period-of-day。最终的捕获组(\w+) 将匹配a-zA-Z0-9_,但不匹配',导致您只捕获一小部分描述。对.+ 的更改允许它匹配任何字符。如果您只知道\w 之外的几个字符需要匹配,您可以在[\w']+ 中添加您需要的任何其他字符。

    https://regex101.com/ 是一个很好的工具来测试你的正则表达式,只要确保你选择了 python 语言。

    【讨论】:

    • 另一个很棒的工具:pythex.org 如果有可能不匹配(例如 AM/PM 是可选的),请将 + 换成星号,即 r"(\w+) at (\d+:\d+ \w*) on (.+)"
    【解决方案3】:

    我想你想要re.compile(r'(\w+) at (\d+:\d+ \w+) on (.+)')

    您的第二组需要记录整个时间(两个数字和一个单词),如果您想获得撇号等,您的第三组需要接受的不仅仅是\w。我建议.+ 这将把所有内容都写到行尾。

    我试过了,得到:

    今天

    下午 12:30

    拉克什的回声

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2015-03-08
      • 2013-02-02
      相关资源
      最近更新 更多