【问题标题】:Regular expression for extracting no. of days, months and years left用于提取编号的正则表达式。还剩几天、几个月和几年
【发布时间】:2021-04-28 19:15:28
【问题描述】:

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

例如,有一句话-“该产品的外壳寿命为 21 天或 21(二十一)天或二十一天或 21 个月、21 年或五天或 5(五)天或五 (5) 天或五 (5) 天。”

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

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

提前致谢

【问题讨论】:

  • 我想出了`"((?:\d+(?:\s([a-z-]+))?|[a-z-]+(?:\s?(\d+) )?)\s(?:year|month|day)s)" 与您的样本数据匹配。你会得到很多误报。例如,“美好的日子,美好的岁月”、“我们最好的月份之一”。

标签: python python-3.x regex regex-group


【解决方案1】:

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

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

模式匹配:

  • \w+(?:-\w+)? 匹配 1+ word char 与可选的 - 和 word chars
  • \s* 匹配可选的空白字符
  • (?:\(\w+(?:-\w+)?\)\s+)? 可选匹配从 (),其中可以有带有可选 - 的单词字符和介于两者之间的单词字符
  • (?:year|month|days)s? 匹配任何备选方案和可选的s
  • \b防止部分匹配的单词边界

查看regex demoPython 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,因此可以进行广泛的匹配。

【讨论】:

  • 非常感谢@第四只鸟。你真的救了我。
  • @UjjwalMahajan 喜欢这个? regex101.com/r/NrtGwY/1
  • 你真的是个救世主……谢谢@第四只鸟
  • 您可以将您的名字从第四只鸟更改为“正则表达式之神”。非常感谢
  • @UjjwalMahajan 不客气 :-) 我只是一个正则表达式的粉丝,还有其他用户是真正的大师。
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多