我很难理解我的错误。请考虑以下示例:
经历了9分钟的延迟
延迟10分钟
我想分别提取9和10。
所以我尝试了这个:
.*(\d{1,2})(?:\s)?(min|m|hour|hr|h|minutes|minute)
但是对于最后一种情况,小组会返回0
而不是10
。我认为\d{1,2}
是贪婪的,因此会返回最长的匹配。
其他不成功的尝试:
.*(\d+)(?:\s)?(min|m|hour|hr|h|minutes|minute)
.*([0-9]+)(?:\s)?(min|m|hour|hr|h|minutes|minute)
答案 0 :(得分:1)
嗯.*
已经贪婪了,但是你想要提取两个数字 - 保持简单,像.*?(\d+).*(\d+)
这样的工作
答案 1 :(得分:1)
您在模式开头使用.*
尽可能多地抓取除换行符之外的任何0 +字符,然后开始回溯,尝试容纳后续子模式的子字符串。这样,你丢失了所有的数字,但是丢失了数字中的最后一个数字。
您需要完全放弃.*
并使用re.search
或re.findall
与r'(\d{1,2})\s?(?:min|m|hour|hr?|minutes?)'
一起使用(请参阅regex demo here):
import re
ss = ['A 9 minutes delay experienced','a 10 minutes delay']
for s in ss:
m = re.search(r'(\d{1,2})\s?(?:min|m|hour|hr?|minutes?)', s)
if m:
print(m.group(1))
请参阅Python demo
此模式在找到时匹配:
(\d{1,2})
- 第1组捕获1位或2位数字(如果您预计会有更长的数字,请使用+
代替{1,2}
)\s?
- 1或0个空格(可能*
更可靠)(?:min|m|hour|hr?|minutes?)
- min
,m
,hour
,h
,hr
等,仅限非捕获组用于分组。