re.match 与 re.search 区别
如果我这样做
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。
为什么会有这样的差别呢?
这和“全局”选项有关吗?(有点像vi中的s///g)
2 个回答
1
请先阅读文档。正如你所期待的,它里面有答案。
这个函数会在给定的字符串中查找符合正则表达式模式的位置,并返回一个匹配对象。如果字符串中没有任何位置符合这个模式,就返回
None
;需要注意的是,这和在字符串中找到一个长度为零的匹配是不同的。
如果字符串开头的零个或多个字符符合正则表达式模式,就返回一个匹配对象。如果字符串不符合这个模式,就返回
None
;同样,这和找到一个长度为零的匹配是不同的。注意:如果你想在字符串的任何位置找到匹配,请使用
search()
。
另外,在同一页面上,还有关于 匹配与查找的内容:
Python 提供了两种基于正则表达式的基本操作:match 只检查字符串开头的匹配,而 search 会检查字符串中的任何位置是否有匹配(这也是 Perl 默认的行为)。
6
在你的匹配中,第一个 .* 是一种叫做 贪婪模式,它会尽可能多地匹配内容,包括数字。如果你让它变得不那么贪婪,它就能正常工作了:
.*?([0-9]{1,})Y.*
(顺便说一下,我觉得这个贪婪的问题让 re.search 和 re.match 的比较不太公平)