一:re.search(patten,string,flags)
import re
pat="abc"
str="qweabcopdabckk"
res=re.search(pat,str)
print(res)
print(type(res))
<_sre.SRE_Match object; span=(3, 6), match='abc'>
<class '_sre.SRE_Match'>
可以看出search方法会返回一个对象(_sre.SRE_Match类的实例对象),并且只会匹配一次正则表达式(当匹配成功之后,就不会继续向后匹配)。
二:re.compile(patten,flags)
import re
pat="abc"
str="qweabcopdabckk"
res=re.compile(pat)
print(type(res))
<class '_sre.SRE_Pattern'>
该方法会返回一个_sre.SRE_Pattern的实例对象。
三:findall(string)
import re
pat="abc"
str="qweabcopdabckk"
res=re.compile(pat).findall(str)
print(res)
print(type(res))
['abc', 'abc']
<class 'list'>
该方法会返回一个list对象,且list对象的每一个元素都是正则表达式所匹配的一个结果。
四:re.match(patten,string,flags)和re.fullmatch(patten,string,flags)
import re
pat="abc"
str="abcopdabckk"
str1="abc"
res=re.match(pat,str)
res1=re.fullmatch(pat,str1)
print(res)
print(type(res))
print(res1)
print(type(res1))
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<class '_sre.SRE_Match'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<class '_sre.SRE_Match'>
re.match()方法只匹配位于字符串开始位置的模式串,re.fullmatch()方法会返回一个和模式串完全匹配的字符串。
贪婪模式和非贪婪模式:
非贪婪模式:*?、+?、??、{ m,n}?
除了非贪婪模式的几种方式外,都是贪婪模式(贪婪模式是默认的)。例子如下:
import re
pat1="a(\d+)b"
pat="a(\d+?)b"
str="a23ba"
res=re.compile(pat).findall(str)
res1=re.compile(pat1).findall(str)
print(res)
print(res1)
['23']
['23']
import re
pat1="a(\d+)"
pat="a(\d+?)"
str="a23ba"
res=re.compile(pat).findall(str)
res1=re.compile(pat1).findall(str)
print(res)
print(res1)
['2']
['23']
区别括号和双括号:
import re
string="abcdefg acbdgef abcdgfe cadbgfe"
#带括号与不带括号的区别
#不带括号
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
[('abcdefg acbdgef', 'abcdefg'), ('abcdgfe cadbgfe', 'abcdgfe')]
['abcdefg', 'abcdgfe']
['abcdefg acbdgef', 'abcdgfe cadbgfe']
第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple
第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。
第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。
(注:参考 点击打开链接)