2014-09-03 32 views
0

我想了解我的python正則表達式有什麼問題。Python的正則表達式在新行替換吞下一個字符

任務: 我有以下的文字。

This is a red fox\LF 
that chases a cat.\LF 
\LF 
The dog barks. 

我需要通過加入它,並把在一行來糾正的第一句話:

This is a red fox that chases a cat.\LF 
The dog barks. 

解決方案: 我只是想出了普通

re.sub(r'(\n)[^\n]', '', text) 

問題: 但是我得到的其實是這樣的:

This is a red foxhat chases a cat. 
he dog barks. 

我確定替換應該只替換組合(\n)。什麼是這個任務的正確的正則表達式?

回答

1

您正在消耗tT,因爲您的模式匹配一​​個換行符以下字符。

您可以使用捕獲組來記住字符是什麼,並將其插回到字符串中。

re.sub(r'\n([^\n])', r'\1', text) 
1

你可以使用這個表達式:

(?<!\.)\\LF\W+ 

Working demo

enter image description here

您還可以使用:

(?<!\.)\\LF$ 

但你會得到不同的結果,你指定。

+0

這應該是比使用「負回顧後發」,但由於不太複雜。 – minerals 2014-09-03 21:30:40

+0

@minerals我明白,語法可能很難看,但如果你用零件來看,它的意思是:「匹配\ LF,如果它之前沒有點」。 – 2014-09-03 21:34:21

1

基本上你說的話,現在是尋找任何新行後跟一個非換行字符和一個空字符串替換兩個字符。

但是,如果你不包含那個第二個字符,你會匹配你的字符串中的任何新行,這不是你想要的。

爲了能夠有一個嚴格的正則表達式,但不能取代你匹配的所有東西,你必須使用捕獲組(...)在正則表達式中,括號之間的內容被捕獲並存儲。

當您進行替換時,您可以使用\index訪問這些存儲的組。 所以\1爲第一捕獲組\2第二等

對於您的問題,您可以使用一個正則表達式,匹配任何不是先前的點的新行。 ([^\.])\n。當然,如果前面的角色不是你想要保留的角色。所以你抓住它。並把它放回你的替代像這樣:

re.sub(r'([^\.])\n', '\1 ', text) 

Example on regex101