Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式:如何指定可选匹配(对于可能为空的子表达式)?_Python_Regex_String - Fatal编程技术网

Python正则表达式:如何指定可选匹配(对于可能为空的子表达式)?

Python正则表达式:如何指定可选匹配(对于可能为空的子表达式)?,python,regex,string,Python,Regex,String,我需要匹配以下输入集: foo_abc_bar foo_bar 并获取abc或空字符串作为结果 这就是我写的正则表达式: r'foo|u abc |[|]bar' 但出于某种原因,这与我给出的第二个字符串不匹配 进一步检查后,我发现[124;]与空字符串不匹配 那么,如何解决这个问题呢?如果您想要这样的字符串模式 xxx_xxx_xxx xxx_xxx 那你需要 ([A-Za-z]{3})((_[A-Za-z]{3})+)? 但这也会起作用 r'foo(_abc)?_bar' ??表

我需要匹配以下输入集:

foo_abc_bar  
foo_bar
并获取abc或空字符串作为结果

这就是我写的正则表达式:

r'foo|u abc |[|]bar'

但出于某种原因,这与我给出的第二个字符串不匹配

进一步检查后,我发现[124;]与空字符串不匹配


那么,如何解决这个问题呢?

如果您想要这样的字符串模式

xxx_xxx_xxx
xxx_xxx
那你需要

([A-Za-z]{3})((_[A-Za-z]{3})+)?
但这也会起作用

r'foo(_abc)?_bar'

??表示可选,可能匹配,也可能不匹配。

如果您想要这样的字符串模式

xxx_xxx_xxx
xxx_xxx
那你需要

([A-Za-z]{3})((_[A-Za-z]{3})+)?
但这也会起作用

r'foo(_abc)?_bar'
??表示可选或不匹配。

要使abc可选,您可以使用:

因此,整个正则表达式变为:

r'foo_(abc_)?bar'
使用此正则表达式,第二个下划线(如果存在)将成为捕获组的一部分。如果您不想这样做,您可以在与.rstrip“”匹配后删除它,或者使用稍微复杂一点的正则表达式:

r'foo_(?:(abc)_)?bar'
我发现[124;]与空字符串不匹配

对。方括号表示字符组。[124;]将恰好匹配一个下划线或一个竖条,而不匹配其他内容。换句话说,当竖条出现在字符组中时,它就失去了它的特殊意义。

要使abc可选,可以使用:

因此,整个正则表达式变为:

r'foo_(abc_)?bar'
使用此正则表达式,第二个下划线(如果存在)将成为捕获组的一部分。如果您不想这样做,您可以在与.rstrip“”匹配后删除它,或者使用稍微复杂一点的正则表达式:

r'foo_(?:(abc)_)?bar'
我发现[124;]与空字符串不匹配


对。方括号表示字符组。[124;]将恰好匹配一个下划线或一个竖条,而不匹配其他内容。换句话说,当竖条出现在字符组中时,它就失去了它的特殊意义。

可能是最好的答案,但并不完全符合问题的要求,因为当你匹配re.matchr'foo\u abc\uBar','foo\u abc\uBar'。组1是'abc\uBar',re.matchr'foo\u abc\uBar',foo\uBar时,组1是无。我无法用嵌套分组做得更好。我可以匹配包括空字符串在内的精确字符串,但位置组下标在这两种情况下有所不同。@jimhark:解决这个问题非常简单。我不想这样做是为了让答案简短。然而,现在评论中提到了这一点,我扩展了答案。r'foo_?:abc_?bar',很好。我会记住的。比我想到的好多了。现在通过返回“abc”正确处理“foo_abc_bar”。但是“foo_bar”仍然不返回任何值。我仍然认为这是最好的答案,调用代码应该只处理None值+1@jimhark:我个人会使用r'foo_abc_?bar'并使用简单的Python逻辑对结果进行后期处理。我认为这将给出最清晰的解决方案。我同意,除非他有一组需要统一处理的正则表达式。这可能是最好的答案,但并不完全符合问题的要求,因为当你匹配re.matchr'foo\u abc\uBar','foo\u abc\uBar','group1是'abc\uBar',re.matchr'foo\u abc\uBar','foo\uBar时,group1是无。我无法用嵌套分组做得更好。我可以匹配包括空字符串在内的精确字符串,但位置组下标在这两种情况下有所不同。@jimhark:解决这个问题非常简单。我不想这样做是为了让答案简短。然而,现在评论中提到了这一点,我扩展了答案。r'foo_?:abc_?bar',很好。我会记住的。比我想到的好多了。现在通过返回“abc”正确处理“foo_abc_bar”。但是“foo_bar”仍然不返回任何值。我仍然认为这是最好的答案,调用代码应该只处理None值+1@jimhark:我个人会使用r'foo_abc_?bar'并使用简单的Python逻辑对结果进行后期处理。我认为这将给出最清晰的解决方案。我同意,除非他有一套需要统一处理的正则表达式。