对匹配的正则表达式模式求反

2024-09-30 14:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我们希望将出现在换行符(\r\n\n\r)之间的字符组合在一起,但忽略引号内的换行符。像这样:

test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?'

match -> hello 
match ->  you, hi, hola, "hei\nhei", hej
match -> hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?

我们设法得到了一些可以满足我们大多数需求的功能,但它不会忽略引号中的换行符:

^{pr2}$

所以我们尝试了一种不同的方法:创建一种模式,找到我们想要排除的模式,然后尝试否定它:

In [344]: [r for r in re.finditer(r'(\r\n|\n)(?=(?:[^"]*"[^"]*")*[^"]*\Z)', test)]
Out[344]:
[<_sre.SRE_Match object; span=(6, 8), match='\r\n'>,
 <_sre.SRE_Match object; span=(38, 40), match='\r\n'>]

但我们不知道如何正确地否定它。我们使用re.finditer()而不是{},因为我们要返回一个生成器。在


Tags: testreyouhellomatch模式hi引号
1条回答
网友
1楼 · 发布于 2024-09-30 14:32:39

您可以使用([^"\r\n]*(?:"[^"]+"[^"\r\n]*)*)。在

这样,您将发现任何没有换行符的字符串,也没有可以在引号中后跟任意数量字符串的引号。在

Demo.

import re,pprint
test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?'
pprint.pprint(re.findall(r'([^\"\r\n]*(?:\"[^\"]+\"[^\"\r\n]*)*)', test))

将输出:

^{pr2}$

相关问题 更多 >