在正则表达式匹配中提取组

新手上路,请多包涵

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

现场 时间 _

输入示例:

今天 中午 12:30Sam 的客厅

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

我写了以下正则表达式:

 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"

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

原文由 Rakesh Adhikesavan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 544
2 个回答

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

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

请注意,第二个捕获组现在将匹配完整的 hour:minute period-of-day 。 The final capture group (\w+) will match a-z , A-Z , 0-9 and _ , but not ' 导致您只能捕获一小部分描述。更改为 .+ 允许它匹配任何字符。如果您只知道 \w 之外的几个字符需要匹配,您可以执行 [\w']+ 以及您需要的任何其他字符。

使用和测试正则表达式的好工具是 https://regex101.com/ 只需确保选择 python 语言即可。

原文由 rsiemens 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以创建嵌套组,但那样可读性不佳,因为您必须计算组的确切数量,然后您会忘记该数字的确切含义。

最好使用命名组。这是从 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'

原文由 Mariy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题