Python 正则表达式:search()、match()和findall()分组 下

下面我们继续:
举例:不是以4、7结尾的手机号码(11位)

import re
phone1 = '12321235267'
result1 = re.match(r'1\d{9}[0-3-689]$',phone1)
print(result1)
phone2 = '12321235269'
result2 = re.match(r'1\d{9}[0-3-689]$',phone2)
print(result2)

结果

None
<re.Match object; span=(0, 11), match='12321235269'>

下面的内容与爬虫相关
提取带有区号的电话号码

import re
phone1 = '010-12345678'
result1 = re.match(r'(\d{3}|\d{4})-(\d{8})$',phone1)
print(result1)

#分别提取
print(result1.group())
#()表示分组 group(1)表示提取到第一组的内容 group(2)表示第二组的内容部分
print(result1.group(1))
print(result1.group(2))

结果

<re.Match object; span=(0, 12), match='010-12345678'>
010-12345678
010
12345678

()表示分组 group(1)表示提取到第一组的内容 group(2)表示第二组的内容部分
举例:匹配<html>abc</html>

import re
msg1 = '<html>abc</html>'
result1 = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>',msg1)
print(result1)
print(result1.group(1))

msg2 = '<h1>hello</h1>'
result2 = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$',msg2)
print(result2)
print(result2.group(1))

结果

<re.Match object; span=(0, 16), match='<html>abc</html>'>
abc
<re.Match object; span=(0, 14), match='<h1>hello</h1>'>
hello

下面我们想如果匹配的字符是这样子的<html><h1>abc</h1></html>

msg3 = '<html><h1>abc</h1></html>'
result3 = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$',msg3)
print(result3)
print(result3.group(1))

结果

<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
<h1>abc</h1>

分析结果:是可以匹配到最后的,因为有+,则是贪婪模式(稍后会讲述),但是如果没有</html>
请看运行结果

msg3 = '<html><h1>abc</h1>'
result3 = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$',msg3)
print(result3)
print(result3.group(1))

<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
<h1>abc</h1>

分析结果也是可以匹配到的,但是却不是完整的,不是成对的,应该是没有匹配成功的,所以要结合【number】来使用

msg3 = '<html><h1>abc</h1>'
result3 = re.match(r'<([0-9a-zA-Z]+)>(.+)</1>$',msg3)     #1表示第一组引用匹配的内容
print(result3)
None

显示结果没有匹配成功,因为是用前面()的内容来往后匹配。

msg4 = '<h1>abc</h2>'
result4 = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$',msg4)     #1表示第一组引用匹配的内容
print(result4)

msg5 = '<h1>abc</h1>'
result5 = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$',msg5)     #1表示第一组引用匹配的内容
print(result5)
print(result5.group(1))
print(result5.group(2))
None
<re.Match object; span=(0, 12), match='<h1>abc</h1>'>
h1
abc

看结果,<h1>abc</h2>是匹配不到的。并且print(result5.group(1)),print(result5.group(2)),是可以取到h1的和abc的。

而如果要与**<html><h1>abc</h1></html>**前后顺序、属性都要相对应
下面看程序:

msg6 = '<html><h1>abc</h1></html>'
result6 = re.match(r'<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</\2></\1>$',msg6)     #1表示第一组引用匹配的内容
print(result6)
print(result6.group(1))
print(result6.group(2))
print(result6.group(3))
<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
html
h1
abc

另外一种方式,就不需要数是第几个()的匹配了,直接以起名字的方式。
起名字的方式:(?P<名字>正则)(?P=名字)

import re
#起名字的方式
msg7 = '<html><h1>abc</h1></html>'
result7 = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',msg7)  
print(result7)
print(result7.group(1))
print(result7.group(2))
print(result7.group(3))
<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
html
h1
abc

总结

分组:() ---->result.group(1)获取组中匹配内容
不需要去引用分组的内容

> 	result2 = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$',msg2) 
> 				print(result2) 
> 				print(result2.group(1))

引用分组匹配内容:
1.number

> 			result3 = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$',msg3) 
> 			print(result3)  			
> print(result3.group(1))

2.?P<名字>

> msg7 = '<html><h1>abc</h1></html>' 
> result7 =re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',msg7)
> print(result7)

re模块

match
search
findall
sub
split

**

举例:sub()

**
程序1

result = re.sub(r’\d+','1000','java:99,python:100')

结果1

java:99,python:99

程序2

def func(temp):
    num = temp.group()
    num1 = int(num)+1
    return str(num1)

result = re.sub(r'\d+',func,'java:99,python:95')
print(result)

结果2

java:100,python:96

举例:split()

程序1

result1 = re.sub(r'\d+','90','java:99,python:95')
print(result1)
result2 =re.split(r',',result1)
print(result2)

结果1

java:90,python:90
['java:90', 'python:90']

程序2

result1 = re.sub(r'\d+','90','java:99,python:95')
print(result1)
result2 =re.split(r'[,:]',result1)
print(result2)

结果2

java:90,python:90
['java', '90', 'python', '90']

分析程序2:在字符串中搜索如果遇到:或者,就分割,将分割的内容保存在列表中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值