Python 使用正则表达式时|前的内容可能包含|后的内容导致|失效,如何解决

标题可能不太清晰,案例是这样的:

 

content = 

MAY 05

...................

.................

DA  

MAY 06

................

.................

CD

MAY19

.................

.................

DA

MAY 31

.................

.................

CD

想使用正则表达式分开每个事件:

findParagraph = re.compile('(MAY+\s?\d\d.*?\nDA\n|MAY+\s?\d\d.*?\nCD\n)',re.S)

Pargaragraphlist = re.findall(findParagraph,content)

for pargaragraph in Pargaragraphlist:

           print(pargaragraphlist)
           print('----------------------------------------------------------')

结果为:

MAY 05

...................

.................

DA  

----------------------------------------------------------

MAY 06

................

.................

CD

MAY19

.................

.................

DA

----------------------------------------------------------

MAY 31

.................

.................

CD

----------------------------------------------------------

 

中间部分的MAY 06 和 MAY19就黏一起了, 有什么解决方法吗

content = '''MAY 05
...................
.................
DA  
MAY 06
................
.................
CD
MAY19
.................
.................
DA
MAY 31
.................
.................
CD'''

import re
reg = re.compile('(([A-Z]+\s*\d+)[\s\S]*?(DA|CD))',re.S)
lst = re.findall(reg,content)
for i in lst:
           print(i)
           print('----------------------------------------------------------')

来看看你的正则 (MAY+\s?\d\d.*?\nDA\n|MAY+\s?\d\d.*?\nCD\n)

(MAY+\s?\d\d.*?\nDA\n|MAY+\s?\d\d.*?\nCD\n)

把这个正则拆分

MAY+\s?\d\d.*?\nDA\n   part1
或
MAY+\s?\d\d.*?\nCD\n   part2

先看part1

MA Y+ \s? \d \d .*? \n DA \n

首先Y后边的+没有意义,在没有()分组或者[]定义字符集的时候,长度修饰只针对前边一个字符,也就是说,+只修饰了Y的长度

然后收.*?\nDA\n,在正则中,虽然有|进行或匹配,但是,还是有顺序的

[i for i in re.findall('ab.*?c|ab.*?d','abcdabxdabdc')]
Out: ['abc', 'abxdabdc']

参考这个例子,ab.*?c|ab.*?d
abcdabxdabdc匹配这个正则,会从第一个字符开始寻找两个表达式,第一个表达式 ab.*?c匹配成功
abc 被剥离,剩余字符串 dabxdabdc 继续匹配
这个时候问题来了,d abxd abd c 我们期望的结果是这样
然而,ab.*?c 的优先级略高于 ab.*d 所以,结果就成了 abxdabdc

[i for i in re.findall('ab.*?(?:c|d)','abcdabxdabdc')]
Out: ['abc', 'abxd', 'abd']

在看这个正则 ab.*?(?:c|d)
c和d的匹配定义是同级的(其实也有优先级,不过相对前边的正则表达式,在这里他们的优先级无限降低)
这个表达式才是我们期望的结果


可以参考https://blog.csdn.net/superwfei/article/details/51753127?spm=1001.2014.3001.5502,这是老顾自己整理的正则学习内容

如有帮助,还望采纳

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m