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

时间:2025-02-11 22:27:00

举例:

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']

这个写法没问题!

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