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

时间:2017-02-01 16:30:13

标签: python regex quotes regex-negation

我们希望将换行符(private http:Http; constructor(/*private http:Http*/ injector:Injector) { setTimeout(() => this.http = injector.get(Http)); } \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(),因为我们想要返回一个生成器。

1 个答案:

答案 0 :(得分:3)

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