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

2024-04-25 19:36:25 发布

您现在位置: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)。此任务的正确正则表达式是什么?你知道吗


Tags: therethatisred解决方案thiscat
3条回答

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

但如果不包含第二个字符,则会匹配字符串中的任何新行,而这并不是您想要的。你知道吗

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

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

对于您的问题,您可以使用一个正则表达式来匹配任何不带点的新行。([^\.])\n。当然,如果前面的字符不是一个点,你就要保留它。所以你抓住了它。把它放回你的替代品里,就像这样:

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

Example on regex101

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

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

Working demo

enter image description here

您还可以使用:

(?<!\.)\\LF$

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

您正在使用tT,因为您的模式匹配换行符和紧跟其后的字符。你知道吗

您可以使用捕获组来记住字符是什么,并将其插入到字符串中。你知道吗

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

或者使用前瞻检查下一个字符,但不捕获它(在您的特定情况下,这可能是一个负前瞻,因为您正在检查换行符):

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

相关问题 更多 >

    热门问题