【问题标题】:Regex - pattern in parttern正则表达式 - 模式中的模式
【发布时间】:2022-11-27 09:21:40
【问题描述】:

如何确保模式的一部分(在本例中为关键字)在您要查找的模式中,但它可以出现在不同的地方。我只想在至少出现一次时进行匹配。

正则表达式:

 \b(([0-9])(xyz)?([-]([0-9])(xyz)?)?)\b

如果有关键字,我们只需要值:xyz

例子:

1. 1xyz-2xyz - it's OK
2. 1-2xyz - it's OK
3. 1xyz - it's OK
4. 1-2 - there should be no match, at least one xyz missing

我尝试正向查找和后视,但这在这种情况下不起作用

【问题讨论】:

标签: regex python-re


【解决方案1】:

您可以使用条件构造:

([0-9])(xyz)?(?:-([0-9])(xyz)?)?(?(2)|(?(4)|(?!)))

请参阅regex demo细节:

  • - 单词边界
  • ([0-9]) - 第 1 组:一个数字
  • (xyz)? - 第 2 组:可选的 xyz 字符串
  • (?:-([0-9])(xyz)?)? - - 的可选序列,一个数字(第 3 组),xyz 可选的字符序列
  • - 单词边界
  • (?(2)|(?(4)|(?!))) - 条件:如果第 2 组(第一个(xyz)?)匹配,则很好,返回匹配项,如果不匹配,则检查第 4 组(第二个(xyz)?)是否匹配,如果匹配则返回匹配项,否则,比赛失败。

Python demo

import re
text = "1. 1xyz-2xyz - it's OK
2. 1-2xyz - it's OK
3. 1xyz - it's OK
4. 1-2 - there should be no match"
pattern = r"([0-9])(xyz)?(?:-([0-9])(xyz)?)?(?(2)|(?(4)|(?!)))"
print( [x.group() for x in re.finditer(pattern, text)] )

输出:

['1xyz-2xyz', '1-2xyz', '1xyz']

【讨论】:

    【解决方案2】:

    试试这个:(([0-9])?(xyz)+([-]([0-9])+(xyz)+)?)? 替换为 + 基本上 ?: 零个或多个,在你的情况下你想匹配一个或多个。 这是+

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2018-07-18
      相关资源
      最近更新 更多