去除换行符包裹

4

我想要去除被换行的文本中的换行符,使其在一定宽度范围内显示。例如:

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

我希望你能够翻译出“生命的意义”的含义。我做错了什么吗?

问题不在于正则表达式,而在于替换字符串,它仍然必须使用Python字符串文字转义反斜杠。因此是 "\\1 \\2"r"\1 \2" 而不是 "\1 \2" - Karl Knechtel
2个回答

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中显示一个信号\
然而,根据这个答案
如果您将此放入程序中的字符串中,则实际上可能需要使用四个反斜杠(因为字符串解析器将在“去转义”字符串时删除其中两个,然后正则表达式需要两个转义的正则表达式反斜杠)。
文档中说:
如前所述,正则表达式使用反斜杠字符('\')来表示特殊形式或允许使用特殊字符而不引起其特殊含义。 这与Python在字符串文字中使用相同字符用于相同目的的用法冲突。
假设您想编写一个匹配字符串\section(可能在LaTeX文件中找到)的RE。 要了解在程序代码中要编写什么内容,请从要匹配的所需字符串开始。 接下来,您必须通过在它们之前加上反斜杠来转义任何反斜杠和其他元字符,从而得到字符串\\section。 必须传递给re.compile()的结果字符串必须是\\section。 但是,要将其表示为Python字符串文字,必须再次转义两个反斜杠。
正如brittenb建议的另一种方式,在这种情况下您不需要RegEx:
>>> x = 'the meaning\nof life'
>>> x.replace("\n", " ")
'the meaning of life'
>>> 

或者使用原始字符串字面量。 - Martijn Pieters
1
你也可以跳过导入 re 的步骤,直接使用 x.replace("\n", " ") - tblznbits
但这会改变所有的换行符。我只想要被字母或逗号夹在中间的那些。 - geotheory
@geotheory:关于那个 str.replace() 的解决方案?似乎你在问题中忘记提到它了 :P - Remi Guan
是的,我本可以更明确一些 :) - geotheory

2
使用原始字符串字面量;Python字符串字面量语法和正则表达式都解释反斜杠;在Python字符串字面量中,\1被解释为八进制转义符,但在原始字符串字面量中不会被解释为八进制转义符。
re.sub(r"([,\w])\n(\w)", r"\1 \2", x)

另一种选择是将所有反斜杠加倍,以便它们作为这样的内容传递到正则表达式引擎中。
请参见 Python 正则表达式 HOWTO 中的 反斜杠瘟疫 部分
演示:
>>> import re
>>> x = 'the meaning\nof life'
>>> re.sub(r"([,\w])\n(\w)", r"\1 \2", x)
'the meaning of life'

可能更容易的方法是按换行符进行拆分;使用 str.splitlines() 方法,然后使用 str.join() 以空格重新连接:
' '.join(ex.splitlines())

但是必须承认,这不能区分单词之间的换行和其他地方的额外换行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接