这个问题是关于操作“?”的。在我之前的问题中,有人错误地将我的问题标记为重复的问题。所以我重新开始问这个问题,问一个答案。你知道吗
我想问一下为什么第一个表达式没有从字符串“axxxbcd”输出('a'、'b'、'c'、'd')。你知道吗
import re
match = re.findall(r'(a).*?(b)?.*?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd
awsbdfdfdcd')
print (match)
输出[1]:[('a','',',','d'),('a',',',',','d'),('a',',',',','d'),('a',',',',','d')]
import re
match = re.findall(r'(a).*?(b)?(c)?(d)','awsssd axxxxxbcd ad adfdfdcdfdd awsbdfdfdcd')
print (match)
输出[2]:[('a'、'''、''、''、'd')、('a'、''、''、'、'、'd')、('a'、''、'、'、'、'd')、('a'、'、'、'、'、'、'、'd')]
@艾萨克
通过将regex的每个元素都包装在捕获括号中,可以更好地理解发生了什么:
输出:
下面是发生的情况:
为什么第4组的结果是内容而不是第2组?最初,它们是相同的,捕获尽可能少(没有),但这将导致整个regex失败。所以发动机必须开始膨胀第2组或第4组。基于这一个例子,似乎引擎首先扩展了后一个组,但我不知道在这种情况下具体的实现规则是什么。为了证明这两个组确实采用了非贪婪策略,可以在字符串的前面添加
d
:例如,使用输入文本axxdxxxbcd
。在这种情况下,第4组只持有xx
。你知道吗以下方法可以满足您的需要:
但我可能不会那样解决问题。正则表达式中的每个(或几乎每个)元素都是可选的,通常很难正确处理。有时,最好在几个简单的阶段中解析文本,而不是在一个大而复杂的正则表达式中。你知道吗
你得到这个输出是因为 .*? 匹配任何字符(行终止符除外)
第一捕获组(a)
a与字符a字面匹配(区分大小写) .*? 匹配任何字符(行终止符除外) *? 量词-零次和无限次之间的匹配,尽可能少的匹配,根据需要扩展(惰性)
第二捕获组(b)?
什么?量词-0到1次之间的匹配,尽可能多的匹配,根据需要回馈(贪婪) b按字面意思与字符b匹配(区分大小写) .*? 匹配任何字符(行终止符除外) *? 量词-零次和无限次之间的匹配,尽可能少的匹配,根据需要扩展(惰性)
第三捕获组(c)?
什么?量词-0到1次之间的匹配,尽可能多的匹配,根据需要回馈(贪婪) c匹配字符c(区分大小写)
第4捕获组(d) d按字面意思与字符d匹配(区分大小写)
但是如果要从字符串“axxxbcd”输出('a'、'b'、'c'、'd')
正则表达式应该是
相关问题 更多 >
编程相关推荐