2014-12-26 190 views
3

我有一些格式不正确的文本需要过滤。因此,有很多情况下,文本中的引用从一行开始,然后切断并在第二行结束。在这种情况下,我的首选是完全删除部分引号,但是,我想保留常规的全引号。我知道这可以用计数器迭代地完成,但我真的更喜欢用正则表达式来处理它。Python正则表达式仅匹配部分圆括号

,举个例子:

 
"This is a quote" 
This is an end "partial- 
quote" Here is more text. 
This is an end "partial- 
quote w/o more text" 
This is an "embedded" quote 

Here是我目前的尝试(\"[^\"\n]+?|^[^\"\n]+?\")(\n|$)注意一个例子,它在两种情况下会失败:

  1. 3号线 - 部分报价收益的剩余部分句子(很少发生,所以如果我们不能解决它不是世界末日)。
  2. 第6行 - 一个嵌入式报价。这是一个主要问题,也是我在问题中采取的主要原因。它将嵌入式报价中的最后一个报价截至行末。

我想我可以设置一个if语句并运行每一行,检查它是否少于两个引号,然后继续解析部分引号,但我认为SO的头脑会有很多清洁解决方案

注意所需的输出是:

 
"This is a quote" 
This is an end 
Here is more text. 
This is an end 
This is an "embedded" quote 

(我处理空格后面上)

+0

也许你可以查看我提出的正则表达式吗? – Jerry

回答

2

在这里你去,

^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|) 

\1\n

更换匹配的字符

DEMO

>>> import re 
>>> s = '''"This is a quote" 
This is an end "partial- 
quote" Here is more text. 
This is an end "partial- 
quote w/o more text" 
This is an "embedded" quote''' 
>>> m = re.sub(r'(?m)^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|)', r'\1\n', s) 
>>> print(m) 
"This is a quote" 
This is an end 
Here is more text. 
This is an end 
This is an "embedded" quote 

使用这个表达式,如果你想对付双引号之间存在内多于一个行。

^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"(?:[^"\n]*\n)+[^"\n]*"(\n|) 

DEMO

+0

对不起,我刚开始玩这个。是否有可能使它不依赖于结束报价?即这不会工作:https://regex101.com/r/tQ4oW4/1 – andoni

+0

哦,它有双引号单数..这是不可能的。 –

+0

编辑:没关系。我想你不能真正知道它是哪一个部分。谢谢! – andoni

1

您或许可以使用这个表达式:

"[^"\n]+?\n[^"\n]+?(?:"|$)\s* 

\n取代。

regex101 demo

"[^"\n]+?\n[^"\n]+?仅匹配部分引号(确保有引号之间的换行)。

ideone demo

1
("[^"\n]*")|"[^"]*(\n)[^"]*"(?![^\n]*")|"[^"]*\n.*?(?=\n[^"]*"[^\n"]*") 

你可以尝试this.This将采取奇数报价为well.See演示的情况下。

https://regex101.com/r/dL7oF8/6

+0

@andoni你可以用奇数个'''尝试这个 – vks