2014-12-26 117 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