删除换行返回

时间:2015-12-19 13:59:56

标签: python textwrapping

我想删除包装到特定宽度的文本的换行符。 e.g。

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

我想要返回the meaning of life。我做错了什么?

2 个答案:

答案 0 :(得分: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

开始
  

如果你把它放在一个程序中的字符串中,你实际上可能需要使用四个反斜杠(因为字符串解析器会删除其中的两个"去逃逸"它用于 string ,然后正则表达式需要两个用于转义的正则表达式反斜杠。)

the document

  

如前所述,正则表达式使用反斜杠字符('\')来表示特殊表单或允许使用特殊字符而不调用它们的特殊含义。这与Python在字符串文字中用于相同目的的相同字符的使用相冲突。

     

我们假设您要编写与字符串\section匹配的RE,该字符串可能位于LaTeX文件中。要弄清楚要在程序代码中写入什么,请从要匹配的字符串开始。接下来,您必须通过在反斜杠前面加上反斜杠来转义任何反斜杠和其他元字符,从而生成字符串\\section。必须传递给re.compile()的结果字符串必须为\\section。但是,要将其表示为Python字符串文字,必须再次转义两个反斜杠。

英国建议的另一种方式是,在这种情况下你不需要RegEx:

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

答案 1 :(得分:2)

使用原始字符串文字; Python字符串文字语法和正则表达式解释反斜杠; python字符串文字中的\1被解释为八进制转义,但不是原始字符串文字:

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())

但不可否认,这不会区分单词之间的换行符和其他地方的额外换行符。