2015-12-19 54 views
4

我想刪除包裝到一定寬度的文本的行返回。例如刪除包裝行返回

import re 
x = 'the meaning\nof life' 
re.sub("([,\w])\n(\w)", "\1 \2", x) 
'the meanin\x01 \x02f life' 

我想返回the meaning of life。我究竟做錯了什麼?

回答

3

你需要逃脫\這樣的:

>>> import re 
>>> x = 'the meaning\nof life' 

>>> re.sub("([,\w])\n(\w)", "\1 \2", x) 
'the meanin\x01 \x02f life' 

>>> re.sub("([,\w])\n(\w)", "\\1 \\2", x) 
'the meaning of life' 

>>> re.sub("([,\w])\n(\w)", r"\1 \2", x) 
'the meaning of life' 
>>> 

如果你不逃避它,輸出的是\1,所以:

>>> '\1' 
'\x01' 
>>> 

這就是爲什麼我們需要使用'\\\\'r'\\'到在Python RegEx中顯示信號\

然而有關,從this answer

如果你把這個字符串中的一個程序中,你實際上可能需要使用四個反斜槓(因爲字符串解析器會刪除他們兩個的時候「去除「它爲字符串,然後正則表達式需要兩個逃脫正則表達式反斜槓)。

而且the document

如前所述,正則表達式用反斜槓字符('\')來表示特殊格式或允許在不調用它們的特殊含義使用特殊字符。這與Python在字符串文字中用於相同目的的相同字符的使用相沖突。

假設你想寫一個匹配字符串\section的RE,它可能在LaTeX文件中找到。要弄清楚在程序代碼中寫什麼,從所需的字符串開始匹配。接下來,您必須通過在反斜槓前加上反斜槓和其他元字符來避開任何反斜槓,從而產生字符串\\section。必須傳遞給re.compile()的結果字符串必須是\\section。但是,要將其表示爲Python字符串文字,則必須再次轉義兩個反斜槓。


另一種方式爲brittenb建議,你不需要正則表達式在這種情況下:

>>> x = 'the meaning\nof life' 
>>> x.replace("\n", " ") 
'the meaning of life' 
>>> 
+0

或使用原始字符串文字。 –

+0

@MartijnPieters:好的,編輯過。 –

+1

您也可以跳過're'的導入並使用'x.replace(「\ n」,「」)''。 – brittenb

2

使用原始字符串字面量; Python字符串文字語法和正則表達式解釋反斜槓; \1在Python字符串字面解釋爲一個八進制轉義,而不是在原始字符串字面量:

re.sub(r"([,\w])\n(\w)", r"\1 \2", x) 

另一種方法是,使他們達到正則表達式引擎這樣加倍所有反斜槓。

查看Python正則表達式HOWTO的Backslash plague section

演示:

>>> import re 
>>> x = 'the meaning\nof life' 
>>> re.sub(r"([,\w])\n(\w)", r"\1 \2", x) 
'the meaning of life' 

可能更容易只是對新行分割;使用str.splitlines() method,然後使用str.join()空間重新加入:

' '.join(ex.splitlines()) 

但無可否認這不會的單詞和額外的新行之間的其他地方換行區分。