举例:
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']
这个写法没问题!
(?<=).(?=) 这就是表达式的一个模式,中间夹着的内容