Python正则表达式-分组操作

  • group()方法

Tip: 只有在正则表达式中采用了()分组,才可以使用group()方法进行提取操作

🌰1

# 提取电话号码中区号和电话号码
phone = '029-85860577'

result = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone) # '$'表示匹配到字符串结尾
print(result)

# 分别提取
print(result.group()) # group()方法中如果不填参数,默认提取全部
print(result.group(1)) # 提起第一个小括号中内容
print(result.group(2)) # 提取第二个小括号中内容

# 输出
# 029-85860577
# 029
# 85860577

🌰2

# 提取html5标签
msg = "<html>hello</html>"

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

# 输出:
# <html>hello</html>
# hello
  • number:\number,number=1-9。引用第number组的数据

上面例子2中,如果要提取的对象msg=<h1>hello<\html> 那么也是可以提取到的,但是我们通常html标签必须是前后对应的,这种实现方式显然不行,由此就引出了number的概念。

如果要提取的对象是msg=<h1>hello<\html> ,我们可以用number这样来实现,将要对应的标签名称用()括起来,然后在后面用number找这个对应的标签即可。如下面🌰

msg = "<h1>hello</html>"

result = re.match(r'(<[0-9a-zA-Z]+>)(.+)</\1>$', msg)  # 格式就是\数字1-9
print(result.group())
print(result.group(2))

# 输出
# None 因为<h1>和<html>并不匹配,所以正则表达式没有匹配上
# None


msg1 = "<html>hello</html>"

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

# 输出:
# <html>hello</html>
# hello

还有多个标签需要前后对应匹配的例子如下

msg_f = '<html><h1>hello</html></h1>'
msg_t = '<html><h1>hello</h1></html>'

result1 = re.match(r'(<[0-9a-zA-Z]+>)(<[0-9a-zA-Z]+>)(.+)</\2></\1>$',msg_f)
result2 = re.match(r'(<[0-9a-zA-Z]+>)(<[0-9a-zA-Z]+>)(.+)</\2></\1>$',msg_t)

print(result1.group())
print(result2.group())

# 输出:
# None
# <html><h1>hello</h1></html>
  • 使用起名的方式:(?P<名字>正则) (?P=名字)

Tip:用于多个分组时

msg = '<html><h1>abd</h1></html>'

result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>', msg)
print(result.group())
print(result.group(1))
print(result.group(2))
print(result.group(3))

# 输出:
# <html><h1>abd</h1></html>
# html
# h1
# abd

解释下上面例子中的result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>', msg)

1、<?P<name1>>是第一个分组的变量名,?P相当于一个标识符,表示name1这个分组的变量名。后面的/w+是我们正常的正则表达式。
2、右边的(?P=name1)是找名字为name1的这个分组。
3、这样就完成了左右匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值