首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >否定匹配的正则表达式

否定匹配的正则表达式
EN

Stack Overflow用户
提问于 2017-02-01 16:30:13
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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?

我们设法使一些能够满足我们大多数需要的东西发挥作用,但它不会忽略引号中的行间隔:

代码语言:javascript
复制
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?'>]

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

代码语言:javascript
复制
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(),因为我们希望返回一个生成器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 16:43:33

你可以和([^"\r\n]*(?:"[^"]+"[^"\r\n]*)*)一起去。

这样,您将发现任何字符串都没有linefeed或引号,可以在引号中跟随任意数量的字符串。

演示。

代码语言:javascript
复制
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))

将产出:

代码语言:javascript
复制
['hello ',
 ' you, hi, hola, "hei\nhei", hej',
 'hello, hi, hola, "hei\nhei", "hej\r\ngreat", you?']
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41984810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档