[英]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.