Python:在之前或之后不贪婪
我做了一些测试来帮助自己理解Python中的非贪婪,但这让我比以前更加困惑。谢谢你的帮助强> 结果:Python:在之前或之后不贪婪,python,extract,greedy,non-greedy,Python,Extract,Greedy,Non Greedy,我做了一些测试来帮助自己理解Python中的非贪婪,但这让我比以前更加困惑。谢谢你的帮助 结果: ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d'] # 1 ['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 2 ['000@h', 'hhaaa@s', 'tephen.marquard@u', '
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d'] # 1
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 2
['000@h', 'hhaaa@s', 'tephen.marquard@u', 'ct.ac.za@b', 'bb@c', 'fff@d'] # 3
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 4
问题:
+?
不需要多次匹配,所以它不需要
+?
匹配尽可能多的字符,而不是尽可能多的字符,这正是贪婪匹配和非贪婪匹配之间的区别
在\S+?@\S+?
匹配的示例中000@hhhaaa@斯蒂芬。marquard@uct.ac.za@bbb@ccc
:
- 它与中的
匹配,但由于存在空格,因此失败
- 它匹配
,然后000
匹配,然后@
再次匹配它必须匹配的\S+?
。它必须\S
000@h
既然电子邮件地址不能包含空格,为什么还要麻烦非贪婪匹配呢?您可以使用像
\S++\S++
这样简单的方法,由于+
的原因,懒惰的\S+?
必须至少匹配一个字符。如果模式后面没有任何内容,它将只匹配一个字符,因为它是惰性的。如果有一个@
,它将匹配尽可能少的字符,直到它匹配第一次出现的@
,也许这个页面会有所帮助@ShoubhikRMaiti我相信python的re模块与使用regex的任何其他软件具有相同的行为。这是完全错误的。正则表达式有多种方言。即使Python也支持两种(re
和regex
)。但是,所有支持非贪婪匹配的regex方言对于这里提出的问题都是完全相同的。非常感谢您的详细解释!我只是研究了非贪婪部分,所以我想做一些测试,看看我是否理解清楚。幸运的是我做了这些测试!现在我明白了!我还以为Python会从@到左手边阅读之前的部分@,事实上我现在意识到Python是从左到右阅读的!!!谢谢
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@c', 'fff@d'] # 1
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 2
['000@h', 'hhaaa@s', 'tephen.marquard@u', 'ct.ac.za@b', 'bb@c', 'fff@d'] # 3
['000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc', 'fff@ddd'] # 4