Python正则表达式在新行替换时吞下一个字符

时间:2014-09-03 21:23:05

标签: python regex

我试图了解我的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)。这个任务的正确正则表达式是什么?

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

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

<强> Working demo

enter image description here

你也可以使用:

(?<!\.)\\LF$

但是你会得到一个不同的输出。

答案 1 :(得分:1)

您正在使用tT,因为您的模式匹配换行符即时跟随字符。

您可以使用捕获组来记住角色的内容,然后将其插回到字符串中。

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

或使用前瞻来检查下一个字符但不捕获它(在您的特定情况下,由于您正在检查 no 换行符,这可能是一个负面的预测)

re.sub(r'\n(?!\n)', r'', text)

答案 2 :(得分:1)

基本上你现在所说的是搜索任何新行后跟非换行符,并用空字符串替换这两个字符。

但是如果你没有包含第二个字符,你就会匹配字符串中的任何新行,而这不是你想要的。

为了能够拥有严格的正则表达式但不能替换您匹配的所有内容,您必须使用捕获组(...)在正则表达式中,捕获并存储括号之间的内容。

进行替换后,您可以使用\index访问这些存储的组。 因此,\1用于第一个捕获的组\2用于第二个等等。

对于您的问题,您可以使用匹配任何前面没有点的新行的正则表达式。 ([^\.])\n。当然,如果前面的字符不是你要保留的点。所以你抓住了它。然后把它放回你的替换中:

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

Example on regex101