【问题标题】:RE.Match any two values in a cell with another cellRE.将一个单元格中的任意两个值与另一个单元格匹配
【发布时间】:2020-04-15 10:12:59
【问题描述】:

我目前正在尝试匹配两个不同电子表格中的两个单元格,到目前为止我可以做到,但现在我遇到一个问题,即一个单元格中有多个值,我想匹配单元格中的两个出现一个包含大量信息的单元格。

例如:

(title) - 数据 A 单元格: 车型变化 90-92

(年)- 数据 B 单元格: 1990|1991|1992|1993|1994|1995|1996|1997|1998|1999

import re

if re.match(year, title):
   print("Success")

但我想尝试匹配标题中数据 B 的任意两个值,但不确定解决问题的最佳方法。

【问题讨论】:

  • 类似this?正则表达式看起来像 \b(?:90|91|92|93|94|95|96|97|98|99)\b 并将匹配 like this
  • 这很好用,谢谢。有没有办法让它需要两年才能找到返回真实值?
  • 你的意思是只在有两个用连字符分隔的 2 位数年份时才返回 true 吗?喜欢this regex demo?
  • 非常接近,但保留 1998(4 位序列),但仅在有两个匹配项时返回 true,例如在上面的演示中,如果找到 1990,如果找到 1992,则返回 true,但仅返回 true如果发现两个事件不是一个。
  • 好的,ideone.com/fBdZrl?

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


【解决方案1】:

你可以像这样动态地构建你的模式

p = "|".join([x[2:] for x in year.split("|")])
rx = re.compile(rf'(?s)\b(?:{p})\b.*?\b(?:{p})\b')

参见the regex demo,只有当它在字符串中找到两次出现的两位数年份时才会匹配。图案细节:

  • (?s) - re.Sre.DOTALL 内联修饰符标志,允许 . 匹配换行符
  • \b(?:90|91|92|93|94|95|96|97|98|99)\b - 90, 91..99 整体而言
  • .*? - 任何 0+ 个字符,尽可能少
  • \b(?:90|91|92|93|94|95|96|97|98|99)\b - 90, 91..99 整体而言

full Python demo:

import re
titles = [r'Car Model Variation 90-92',r'Car Model Variation 90']
year = r'1990|1991|1992|1993|1994|1995|1996|1997|1998|1999'
p = "|".join([x[2:] for x in year.split("|")])
rx = re.compile(rf'(?s)\b(?:{p})\b.*?\b(?:{p})\b')

for title in titles:
  print ( f"'{title}' =>", bool(rx.search(title)) )

输出:

'Car Model Variation 90-92' => True
'Car Model Variation 90' => False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多