Python:前后不贪心

Python: non greedy before or after

我做了一些测试来帮助自己理解 Python 中的非贪婪,但这让我比以前更加困惑。感谢您的帮助!

lan='From 000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc fff@ddd eee'
print(re.findall('\S+@\S+?',lan))          # 1
print(re.findall('\S+@\S+',lan))           # 2
print(re.findall('\S+?@\S+?',lan))         # 3
print(re.findall('\S+?@\S+',lan))          # 4

结果:

['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

问题:

  1. 为什么结果只显示一个 d - @d?
  2. 正常,很清楚
  3. 很迷茫,连背后的逻辑都不知道怎么问了。。。尤其是和1比较的时候。。。
  4. 好像和2一样,为什么呢? @之前是这样的'weak'?
  1. why result only shows one d here - @d?

因为+?不需要匹配多次,所以不需要。

  1. is normal, very clear.
  2. very confusing, I even do not know how to ask the logic behind... Especially when compared with 1...

同样,+? 匹配尽可能多的字符 - 而不是匹配尽可能多的字符 ],这正是贪心匹配和非贪心匹配的区别。

关于\S+?@\S+?匹配From 000@hhhaaa@stephen.marquard@uct.ac.za@bbb@ccc的例子:

  • 它匹配 From,但随后失败,因为有一个 space。
  • 它匹配 000,然后匹配 @,然后 \S+? 再次 匹配尽可能多的 \S不得不。它必须匹配1个字符。
  • 整体匹配度为000@h
  1. it seems it is same as 2, so why ? before @ is so 'weak'?

以上解释。


既然电子邮件地址不能包含 spaces,为什么还要费心进行非贪婪匹配呢?你可以使用像 \S+@\S+.

这样简单的东西