我很难理解我的错误。考虑这些例子:
A 9 minutes delay experienced
a 10 minutes delay
我想分别提取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+ 个字符,然后开始回溯,尝试为后续子模式容纳子字符串.这样,您将丢失除最后一位以外的所有数字。
您需要完全丢弃 .* 并使用 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,hourcode>,h,hr等非捕获组,仅用于分组。
