1、match:是从开头匹配,若开头不满足,则返回null;
2、search: 在整个字符串中去匹配,匹配到一个即停止;
3、findall: 在整个字符串中匹配所有符合的,且以列表形式得到子串;
4、sub:替换每一个被匹配到的字符串,返回替换后的字符串。
(1)eg:findall
string='one1two2three3four4'
pattern =re.compile('\d+')
print (re.findall(pattern,string))
结果为:[‘1’, ‘2’, ‘3’, ‘4’]
(2)若改用search,则返回结果为1,因为匹配到第一个数字即停止;
print(re.search(pattern,string).group())
(3)若改用match,如下:则报错
print(re.match(pattern,string).group())
因为match是从匹配第一个字符,匹配不上,则返回null,会报null没有group属性,修改如下:
if re.match(pattern,string):
print(re.match(pattern,string).group())
else:
print ('null')
由此深入研究match,若将string改下:
string='2one'
print(re.match(pattern,string).group())
print(re.match(pattern,string).groups())
第一条结果为2;
第二条结果为()。
由此猜想应该是group()与groups()区别:
若继续将string与表达式改下:
string='234one'
print(re.match(pattern,string).group())
print(re.match(pattern,string).groups(2))
结果分别为:
234
()
经查证后groups()是必须要表达式里含有括号,才会有结果,由此将表达式改为如下:
string='234one'
pattern =re.compile('(\d+)')
print(re.match(pattern,string).group())
print(re.match(pattern,string).groups())
得到结果为:
234
(‘234’,)
继续改如下:
string='24one'
pattern =re.compile('(\d+)(\d+)')
print(re.match(pattern,string).group()) #得到所有匹配结果
print(re.match(pattern,string).group(1)) #得到第一组匹配结果
print(re.match(pattern,string).group(2)) #得到第二组匹配结果
print(re.match(pattern,string).groups()) #得到所有匹配结果,且以列表形式展示
得到结果如下:
24
2
4
(‘2’, ‘4’)
(4)sub–替换每一个被匹配到的字符串,返回替换后的字符串
eg1:
string='one1two2three3four4'
pattern =re.compile('\d+')
print (re.sub(pattern,'|',string))
结果为:one|two|three|four|
eg2:
string='i say, hello world'
pattern =re.compile(r'(\w+) (\w+)')
print (re.sub(pattern,r'\2 \1',string))
结果为:say i, world hello
其中第二个例子中若将r都去掉,则得不到此结果,经查r的作用是:r代表了原字符串,比如需匹配字符串isay\n,则表达式写为:re.compile(‘isay\n’),已达到转义目的,采用r,则写为
re.compile(r’isay\n’)即可,差别在于用不用加转义字符。