Python正则表达式:匹配1或2位数,返回最长

时间:2016-12-22 00:35:18

标签: python regex

我很难理解我的错误。请考虑以下示例:

  

经历了9分钟的延迟

     

延迟10分钟

我想分别提取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) 

2 个答案:

答案 0 :(得分:1)

.*已经贪婪了,但是你想要提取两个数字 - 保持简单,像.*?(\d+).*(\d+)这样的工作

答案 1 :(得分:1)

您在模式开头使用.*尽可能多地抓取除换行符之外的任何0 +字符,然后开始回溯,尝试容纳后续子模式的子字符串。这样,你丢失了所有的数字,但是丢失了数字中的最后一个数字。

您需要完全放弃.*并使用re.searchre.findallr'(\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?) - minmhourhhr等,仅限非捕获组用于分组。