Python 正则 findall 多规则匹配问题 结果是元组 解决过程

举例:

s='123456'

re.findall('1(.)3|4(.)6',s1)
Out[135]: [('2', ''), ('', '5')]

re.findall('1|4(.)3|6',s1)
Out[136]: ['', '']

re.findall('(?:1|4)(.)(?:3|6)',s1)
Out[137]: ['2', '5']

re.findall('(?:1|4).(?:3|6)',s1)
Out[138]: ['123', '456']

re.findall('(?:1|4)(.)(?:3|6)',s1)
Out[139]: ['2', '5']

s1='1234561896'

re.findall('(?:1|4)(.)*(?:3|6)',s1)
Out[141]: ['9']

re.findall('(?:1|4)(.*)(?:3|6)',s1)
Out[142]: ['23456189']

re.findall('(?:1|4)(.*?)(?:3|6)',s1)
Out[143]: ['2', '5', '89']

我想一个re就把想得到的两个规则的结果得出来,但是却发生了问题:
实例:
s来自于Unicode的源代码

re.findall(r'"range">(.*?)<',s)[:3]
Out[149]: ['0000—007F', '0080—00FF', '0100—017F']

re.findall('<a .*>(.*)?</',s)[:3]
Out[150]: ['基本拉丁字母', '拉丁文补充1', '拉丁文扩展A']

re.findall(r'"range">(.*?)<|<a .*>(.*?)<',s)[:3]
Out[145]: [('0000—007F', ''), ('', '基本拉丁字母'), ('0080—00FF', '')]

re.findall('(?:"range">|<a .*>)(.*)?</',s)[:3]
Out[146]: ['0000—007F', '基本拉丁字母', '0080—00FF']

这里还是不完美,因为最后的写法是得到了结果,万一规则1和规则2的结尾不一样呢,万一规则1开头配规则2结尾或者规则2开头配规则1结尾存在且不是想要的结果呢。

问题解决过程:
Python 正则re模块之findall()详解
这里提到了如果规则中出现多个括号,结果就回生成一个多个元素的元组
python 正则表达式findall匹配问题
这里提到在菜鸟教程的解释中,括号是接收结果的,而(?:)是括起来称为当作一个单位看缺不返回结果
Python 正则表达式 | 菜鸟教程

我更倾向这是个坑,是个bug!

re.findall('(?<=1).(?=3)|(?<=4).*(?=6)',s)
Out[11]: ['2', '5']

这个写法没问题!

(?<=).(?=) 这就是表达式的一个模式,中间夹着的内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值