我试图了解我的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)
。这个任务的正确正则表达式是什么?
答案 0 :(得分:1)
答案 1 :(得分:1)
您正在使用t
和T
,因为您的模式匹配换行符和即时跟随字符。
您可以使用捕获组来记住角色的内容,然后将其插回到字符串中。
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)