提取号码的正则表达式剩下的天数、月数和年数

Regular expression for extracting no. of days, months and years left

我正在尝试编写一个正则表达式来提取某事的剩余时间,可以是天、月或年。

例如,有一句话-“This product has a shell life of 21 days or 21 (twenty-one) days or 21 days or 21 months, 21 years or 5 days or 5(五)天或五(5)天或五(5)天。

我知道这是一个有趣的句子,但重点是我想提取上面句子中的持续时间。

我写了一个正则表达式 (?:\w*\-?\w*\s*\(\s*\d+\s*\w*\)\s*\w*|\b\d*\s+\w*\d*)\s*(?:year|month|day)s? 但它没有提取 5(五)天或有数字后跟(单词)的持续时间。任何人都可以帮助正则表达式吗?

提前致谢

如果你想匹配示例数据中的部分,你可以使用

\w+(?:-\w+)?\s*(?:\(\w+(?:-\w+)?\)\s+)?(?:year|month|days)s?\b

模式匹配:

  • \w+(?:-\w+)? 将 1+ 个单词字符与可选的 - 和单词字符匹配
  • \s* 匹配可选的空白字符
  • (?:\(\w+(?:-\w+)?\)\s+)? 可选择匹配从 (),其中可以有带有可选 - 的单词字符和介于
  • 之间的单词字符
  • (?:year|month|days)s? 匹配任意选项和一个可选的 s
  • \b 防止部分匹配的单词边界

看到一个regex demo or a Python demo

示例

import re
from pprint import pprint

regex = r"\w+(?:-\w+)?\s*(?:\(\w+(?:-\w+)?\)\s+)?(?:year|month|days)s?\b"

s = "This product has a shell life of 21 days or 21 (twenty-one) days or twenty-one days or 21 months, 21 years or five days or 5 (five) days or five (5) days or five(5) days."

pprint (re.findall(regex, s))

输出

['21 days',
 '21 (twenty-one) days',
 'twenty-one days',
 '21 months',
 '21 years',
 'five days',
 '5 (five) days',
 'five (5) days',
 'five(5) days']

注意 \s 也可以匹配换行符,而 \w 可以匹配数字和字符 a-z,因此匹配范围很广.