为了账号安全,请及时绑定邮箱和手机立即绑定

表达式中的正则表达式“AND”提取这个和那个

表达式中的正则表达式“AND”提取这个和那个

慕后森 2023-10-18 21:32:31
我正在努力编写一个正则表达式来提取下面以粗体显示的数字。我为每个值设置了 3 个不同的正则表达式,但由于最后一个值之间可能有空格,我不知道如何在此处容纳“AND”。轮胎 = '轮胎:P 275 / 65 R 18 A/S;275 / 65 R 18自动变速箱 猫头鹰;265 / 70 R 17 A/T 猫头鹰;'我已经尝试过了,它适用于前两个,但不适用于最后一个。我想在单个正则表达式中包含最后一个。p1 = re.compile(r'(\d+)/')p2 = re.compile(r'/(\d+)')p3 = re.compile(r'(?=.*[R](\d+))(?=.*[R]\s(\d+))')我尝试过不同的东西,这是我尝试的最后一个代码,但结果不成功如果我这样做p1.findall(tire), p2.findall(tire), p3.findall(tire)我想看到这个:(['275', '275', '265'], ['65', '65', '70'], ['18', '18', '17'])
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

你就快到了!您不需要三个单独的正则表达式。相反,请在单个正则表达式中使用多个捕获组。

(\d{3})\/(\d{2})R\s?(\d{2})

尝试一下: https: //regex101.com/r/Xn6bry/1

解释:

  • (\d{3}):捕获三位数字

  • \/: 匹配正斜杠

  • (\d{2}):捕获两位数

  • R\s?:匹配R后跟一个可选的空格

  • (\d{2}):捕获两位数。

在 Python 中,执行以下操作:

p1 = re.compile(r'(\d{3})\/(\d{2})R\s?(\d{2})')

tire = 'Tire: P275/65R18 A/S; 275/65R 18 A/T OWL;265/70R 17 A/T OWL;'

matches = re.findall(p1, tire)

现在如果你看一下matches,你会得到 [('275', '65', '18'), ('275', '65', '18'), ('265', '70', '17')]


将其重新排列为您想要的格式应该非常简单:


# Make an empty list-of-list with three entries - one per group

groups = [[], [], []]

for match in matches:

    for groupnum, item in enumerate(match):

        groups[groupnum].append(item)

现在groups是[['275', '275', '265'], ['65', '65', '70'], ['18', '18', '17']]


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信