gpt4 book ai didi

python - 否定匹配的正则表达式模式

转载 作者:行者123 更新时间:2023-11-30 22:42:49 25 4
gpt4 key购买 nike

我们希望将换行符之间出现的字符分组在一起(\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?

我们设法让一些东西能够满足我们的大多数需求,但它不会忽略引号内的换行符:

In [342]: test = 'hello \r\n you, hi, hola, "hei\nhei", hej\r\nhello, hi, hola, "hei\nhei", "hej\r\ngreat", you?'

In [343]: [r for r in re.finditer(r'([^(\r\n)])+', test)]
Out[343]:
[<_sre.SRE_Match object; span=(0, 6), match='hello '>,
<_sre.SRE_Match object; span=(8, 28), match=' you, hi, hola, "hei'>,
<_sre.SRE_Match object; span=(29, 38), match='hei", hej'>,
<_sre.SRE_Match object; span=(40, 61), match='hello, hi, hola, "hei'>,
<_sre.SRE_Match object; span=(62, 72), match='hei", "hej'>,
<_sre.SRE_Match object; span=(74, 86), match='great", you?'>]

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

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() 而不是 re.split() 因为我们想返回一个生成器。

最佳答案

您可以使用([^"\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))

将输出:

['hello ',
' you, hi, hola, "hei\nhei", hej',
'hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?']

关于python - 否定匹配的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41984810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com