如果我这样做
import re
m = re.compile("[0-9]{1,}Y")
res = m.search("AUD3M25Y_EOD2")
if res:
return res.group(0)[:-1]
我将得到25作为答案
但是,如果我这样做
import re
m = re.compile(".*([0-9]{1,})Y.*")
res = m.match("AUD3M25Y_EOD2")
if res:
return res.groups(0)
我只会得到5.
为什么会有差异?
是否与'global'选项有关? (很像s /// g in vi)
答案 0 :(得分:6)
在你的比赛中,第一个。*是greedy,它尽可能匹配,包括数字。 如果你不那么贪心,它会起作用:
.*?([0-9]{1,})Y.*
(PS我认为这个贪婪的问题并没有使它成为re.search和re.match的公平比较)
答案 1 :(得分:2)
请先阅读文档。正如您所料,它有答案。
扫描 string ,查找正则表达式 pattern 生成匹配项的位置,并返回相应的匹配对象。如果字符串中没有位置与模式匹配,则返回
None
;请注意,这与在字符串中的某个点找到零长度匹配不同。
如果 string 开头的零个或多个字符与正则表达式 pattern 匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回
None
;请注意,这与零长度匹配不同。注意:如果您想在字符串中的任何位置找到匹配项,请改用
search()
。
此外,在同一页面上Matching vs. Searching:
Python提供了两种基于正则表达式的基本操作:匹配仅在字符串的开头检查匹配,而搜索检查匹配中的任何位置string(这是Perl默认执行的操作)。