我有一组输入。我正在尝试编写一个正则表达式来匹配输入中的以下模式:
天在时间上的位置
示例输入:
今天,在下午12:30在Sam的客厅
文本的粗体部分在每个输入中都不同。
我写了以下正则表达式:
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)
Run Code Online (Sandbox Code Playgroud)
哪个有效,我正在匹配正确的模式。我现在试图从模式中提取组。
我想要的输出是:
re_match.group(1)
>> "Today"
re_match.group(2)
>> "12:30 PM"
re_match.group(3)
>> "Sam's living room"
Run Code Online (Sandbox Code Playgroud)
但是,我当前的正则表达式匹配没有给我这个输出。什么是正确的正则表达式,可以给我上述输出?
你很接近。你只是想稍微调整一下你的捕获组看起来像......
re.compile(r"(\w+) at (\d+:\d+ \w+) on (.+)")
请注意,第二个捕获组现在将匹配完整的hour:minute period-of-day. 最终捕获组(\w+)匹配a-z,A-Z,0-9和_,但不会'导致你只捕获描述的小一点。更改为.+允许它匹配任何字符。如果您只知道\w需要匹配之外的几个字符,您可以[\w']+使用您需要包含的任何其他字符。
使用和测试正则表达式的好工具是https://regex101.com/,只需确保选择 python 语言即可。
您可以创建嵌套组,但这样可读性不强,因为您必须计算组的确切编号,然后您将忘记该编号的确切含义。
最好使用命名组。这是从 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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15278 次 |
| 最近记录: |