我想问为什么第一个表达式不输出(' a'' b',' c',' d')来自字符串' axxxxxbcd'。
import re
match = re.findall(r'(a).*?(b)?.*?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd
awsbdfdfdcd')
print (match)
输出[1]:[(&#39; a&#39;,&#39;&#39;,&#39;&#39;&#39; d&#39;),(&# 39; a&#39;,&#39;&#39;&#39; c&#39;&#39; d&#39;),(&#39; a&#39;,&#39;& #39;,&#39;&#39;,&#39; d&#39;),(&#39; a&#39;,&#39;&#39;,&#39;&#39; ,&#39; d,(&#39; a&#39;,&#39;&#39;,&#39;&#39;&#39; d&#39;)] < / p>
import re
match = re.findall(r'(a).*?(b)?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd awsbdfdfdcd')
print (match)
输出[2]:[(&#39; a&#39;,&#39;&#39;,&#39;&#39;&#39; d&#39;),(&# 39; a&#39;,&#39;&#39;&#39; c&#39;&#39; d&#39;),&#39; a&#39;,&#39;& #39;,&#39;&#39;,&#39; d&#39;),(&#39; a&#39;,&#39;&#39;,&#39;&#39; ,&#39; d,(&#39; a&#39;,&#39;&#39;,&#39;&#39;&#39; d&#39;)] < / p>
答案 0 :(得分:0)
不是正则表达式引擎的专家,但在内部看起来像正则表达式引擎吃字符以在第一个之前提供第二个.*?
,跳过(b)?
部分,因为它是可选的。
不确定它是否足够清楚,但我想你会在regex101 debugger上得到它。
也就是说,添加一点contrast而不是选择任何字符可以保存您的匹配:
(a)[^bcd\s]*(b)?[^cd\s]*(c)?(d)
演示here。