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
问题:
- 为什么结果只显示一个 d - @d?
- 正常,很清楚
- 很迷茫,连背后的逻辑都不知道怎么问了。。。尤其是和1比较的时候。。。
- 好像和2一样,为什么呢? @之前是这样的'weak'?
- why result only shows one d here - @d?
因为+?
不需要匹配多次,所以不需要。
- is normal, very clear.
- 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
。
- it seems it is same as 2, so why ? before @ is so 'weak'?
以上解释。
既然电子邮件地址不能包含 spaces,为什么还要费心进行非贪婪匹配呢?你可以使用像 \S+@\S+
.
这样简单的东西
我做了一些测试来帮助自己理解 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
问题:
- 为什么结果只显示一个 d - @d?
- 正常,很清楚
- 很迷茫,连背后的逻辑都不知道怎么问了。。。尤其是和1比较的时候。。。
- 好像和2一样,为什么呢? @之前是这样的'weak'?
- why result only shows one d here - @d?
因为+?
不需要匹配多次,所以不需要。
- is normal, very clear.
- 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
。
- it seems it is same as 2, so why ? before @ is so 'weak'?
以上解释。
既然电子邮件地址不能包含 spaces,为什么还要费心进行非贪婪匹配呢?你可以使用像 \S+@\S+
.