Skip to main content
 首页 » 编程设计

Python 正则表达式 : Match 1 or 2 digits, 返回最长

2024年08月21日30小虾米

我很难理解我的错误。考虑这些例子:

A 9 minutes delay experienced

a 10 minutes delay

我想分别提取9和10。

所以我尝试了这个:

.*(\d{1,2})(?:\s)?(min|m|hour|hr|h|minutes|minute)  

test link

但对于最后一种情况,组返回 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, hour code>, h, hr等非捕获组,仅用于分组。