繁体   English   中英

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

[英]Regex having optional groups with non-capturing groups

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

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

输入将类似于input_text = "xyz T1 VX N1 " ,预期为 output 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']

提前致谢!

我建议

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

请参阅正则表达式演示

替代方法是组合环视,确保匹配前面紧跟一个空白字符或字符串开头,匹配的第一个字符是空白字符,另一个环视组合(在模式的末尾)确保匹配结束字符是非空格,然后是空格或字符串结尾:

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

请参阅此正则表达式演示

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

  • 开头的\b(?=\w)确保单词边界 position 匹配,即紧跟单词 char
  • \b(?<=\w)在结尾处断言 position 在字边界处,左侧有一个字 char
  • (?<?\S)(?=\S) - 一个 position,它位于字符串的开头,或者紧跟在一个空格之后,然后紧跟一个非空格字符
  • (??\S)(?<=\S) - 一个 position 位于字符串的末尾,或者紧接在空格之前,并且紧接在非空格字符之前。

请参阅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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM