当前位置: 首页 > 知识库问答 >
问题:

具有具有非捕获组的可选组的正则表达式

云长恨
2023-03-14

我有一个具有多个可选和非捕获组的正则表达式。所有这些组都可能发生,但不必发生。正则表达式应使用非捕获组返回整个字符串。

当我将最后一个组也设置为可选时,正则表达式将具有多个分组结果。当我将第一组设置为非可选时,正则表达式匹配。为什么?

输入将类似于input_text="xyz T1 VX N1",预期输出T1 VX N1

regexs = {
    "allOptional": 'p?(?:T[X0-4]?)?\\s?(?:V[X0-2])?\\s?(?:N[X0-3])?',
    "lastNotOptional": 'p?(?:T[X0-4]?)?\\s?(?:V[X0-2])?\\s?(?:N[X0-3])',
    "firstNotOptional": 'p?(?:T[X0-4]?)\\s?(?:V[X0-2])?\\s?(?:N[X0-3])?',
}

for key, regex in regexs.items():
    matches = re.findall(regex, input_text)

    # Results
    allOptional = ['', '', '', ' ', 'T1 VX N1', '']
    lastNotOptional = ['T1 VX N1']
    firstNotOptional = ['T1 VX N1']

提前感谢!

共有1个答案

羊时铭
2023-03-14

我建议

\b(?=\w)p?(?:T[X0-4]?)?\s?(?:V[X0-2])?\s?(?:N[X0-3])?\b(?<=\w)

请参阅正则表达式演示。

另一种选择是lookaround的组合,确保匹配的前面紧跟一个空格字符或字符串的开头,并且匹配的第一个字符是一个空格字符,以及另一个环视组合(在模式的末尾)以确保匹配结束字符是非空格,然后一个空格或字符串末尾如下:

(?<!\S)(?=\S)p?(?:T[X0-4]?)?\s?(?:V[X0-2])?\s?(?:N[X0-3])?(?!\S)(?<=\S)

查看这个正则表达式演示。

这里要点是两个特定的单词/空白边界:

    < li> \b(?=\w)确保单词边界位置匹配,后面紧跟一个单词char < li> \b(?

观看Python演示:

import re
input_text = "xyz T1 VX N1 G1"
pattern = r'\b(?=\w)p?(?:T[X0-4]?)?\s?(?:V[X0-2])?\s?(?:N[X0-3])?\b(?<=\w)'
print(re.findall(pattern, input_text))
# => ['T1 VX N1']

 类似资料:
  • 我是一个完全的正则表达式新手,花了几个小时试图解决这个难题。我认为我必须使用某种可选的非捕获组或交替。 我想匹配以下字符串: > 诺伊尔电影 a von 1000 诺伊尔电影a von 1000 mit b 诺伊尔电影a von 1000 mit b und c 1000英镑的新电影 诺伊尔电影公司 诺伊尔电影a mit b und c 诺伊尔电影a mit b und c und 我的正则表达式

  • 我正在分析的文本包括捕获组前后以及捕获组内的星号。我确定的解析捕获组的模式基本上是:文本前的连续星号总是至少为30。类似地,最后一个单词后面的连续星号长度至少为15个字符。捕获组中的连续星号始终小于10。我遇到的问题是,我不确定如何给捕获组中的星号和组中的其他字符赋予不同的量词,但将其包含在同一匹配集中。例如: 所以基本上,我只需要捕获文本部分。星号可以存在于实际文本之前和之后(我可以稍后删除),

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 我正在尝试从用户输入中提取一些应遵循以下格式的数据:,这意味着用户输入的时间量为1天,5小时30分钟。 我正在尝试提取输入的每个部分的值。但是,每个组都是可选的,这意味着 是有效输入。 我试图在输入中保持灵活性(从某种意义上说,并非所有部分都需要输入),但与此同时,我不会看着我的正则表达式来匹配一些随机的插补,如。这个应该被拒绝(没有匹配项)。 因此,首先我去掉了用户可能使用过的任何分隔符(他们的

  • 本文向大家介绍PHP正则表达式之捕获组与非捕获组,包括了PHP正则表达式之捕获组与非捕获组的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中

  • 我有一个工作正则表达式来提取一些信息。php代码如下所示: https://ideone.com/UdIaA7 与str:https://regex101.com/r/rF0uP7/5 带有str2的正则表达式:https://regex101.com/r/cV6iF9/1 然而,它在str上工作得很好,但在str2上却不匹配,我找不到原因