提取号码的正则表达式剩下的天数、月数和年数
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,因此匹配范围很广.
我正在尝试编写一个正则表达式来提取某事的剩余时间,可以是天、月或年。
例如,有一句话-“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,因此匹配范围很广.