我试着用regex来匹配n年m个月x天的模式。n years、m months、x days和and可能在字符串中,也可能不在字符串中。为了精确匹配,我可以使用regex提取它:
re.search(r'(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?', '2 years 25 days')它返回2年25天,但如果字符串中有附加文本,则不匹配如下:
re.search(r'(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?', 'in 2 years 25 days')复旦'‘
我试过这个:
re.search(r'.*(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?.*', 'in 2 years 25 days')want返回整个字符串,但我不想要额外的文本。
发布于 2022-07-20 07:48:51
您将得到一个带有最后一个模式的空字符串,因为regex中的所有部分都是可选的,因此它也将匹配一个空字符串。
如果所有部件都是可选的,但希望至少匹配其中的一个,则可以使用前导断言。
\b(?=\d+ (?:years?|months?|days?)\b)(?:\d+ years?)?(?:\s*\d+ months?)?(?:\s*\d+ days?)?\b解释
\b A字界(?=\d+ (?:years?|months?|days?)\b)断言到右边的1+位数和其中的一个选项(?:\d+ years?)?匹配1+数字、空格和年份或年份(?:\s*\d+ months?)?相同(?:\s*\d+ days?)?相同\b A字界示例
import re
pattern = r'\b(?=\d+ (?:years?|months?|days?)\b)(?:\d+ years?)?(?:\s*\d+ months?)?(?:\s*\d+ days?)?\b'
m = re.search(pattern, 'in 2 years 25 days')
if m:
print(m.group())输出
2 years 25 days发布于 2022-07-20 06:12:24
因为years、months、days是时态单元,所以可以使用品脱模块。
用品脱解析时态单元
请参阅使用的字符串解析教程和相关特性:
from pint import UnitRegistry
ureg = UnitRegistry()
temporal_strings = '2 years and 25 days'.split('and') # remove and split
quantities = [ureg(q) for q in temporal_strings] # parse quantities
# [<Quantity(2, 'year')>, <Quantity(25, 'day')>]
# print the quantities separately
for q in quantities:
print(q)
# get the total days
print(f"total: {sum(quantities)}")
print(f"total days: {sum(quantities).to('days')}")印刷输出:
2 year
25 day
total: 2.0684462696783026 year
total days: 755.5 day发布于 2022-07-20 04:00:17
你可以试试这个:
import re
match =re.search(r'(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))', 'in 2 years 25 days')
if match:
print(match.group())输出:
2 years 25 dayshttps://stackoverflow.com/questions/73045731
复制相似问题