首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python regex提取n年m个月和x天模式

使用python regex提取n年m个月和x天模式
EN

Stack Overflow用户
提问于 2022-07-20 03:39:09
回答 3查看 52关注 0票数 0

我试着用regex来匹配n年m个月x天的模式。n yearsm monthsx daysand可能在字符串中,也可能不在字符串中。为了精确匹配,我可以使用regex提取它:

代码语言:javascript
复制
re.search(r'(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?', '2 years 25 days')

它返回2年25天,但如果字符串中有附加文本,则不匹配如下:

代码语言:javascript
复制
re.search(r'(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?', 'in 2 years 25 days')

复旦'‘

我试过这个:

代码语言:javascript
复制
re.search(r'.*(?:\d+ year(s?))?\s*(?:\d+ month(s?))?\s*(?:\d+ day(s?))?.*', 'in 2 years 25 days')

want返回整个字符串,但我不想要额外的文本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-20 07:48:51

您将得到一个带有最后一个模式的空字符串,因为regex中的所有部分都是可选的,因此它也将匹配一个空字符串。

如果所有部件都是可选的,但希望至少匹配其中的一个,则可以使用前导断言。

代码语言:javascript
复制
\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字界

Regex演示 x- Python演示

示例

代码语言:javascript
复制
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())

输出

代码语言:javascript
复制
2 years 25 days
票数 1
EN

Stack Overflow用户

发布于 2022-07-20 06:12:24

因为yearsmonthsdays是时态单元,所以可以使用品脱模块。

用品脱解析时态单元

请参阅使用的字符串解析教程和相关特性:

代码语言:javascript
复制
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')}")

印刷输出:

代码语言:javascript
复制
2 year
25 day
total: 2.0684462696783026 year
total days: 755.5 day
票数 0
EN

Stack Overflow用户

发布于 2022-07-20 04:00:17

你可以试试这个:

代码语言:javascript
复制
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())

输出:

代码语言:javascript
复制
2 years 25 days
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73045731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档