Python 用于删除换行符的正则表达式

Python 用于删除换行符的正则表达式,python,regex,python-2.7,Python,Regex,Python 2.7,我对Python是一个完全的新手,我被一个正则表达式问题困住了。我试图删除文本文件中每行末尾的换行符,但仅当它紧跟在小写字母之后时,即[a-z]。如果行尾以小写字母结尾,我想用空格替换换行符/换行符 到目前为止,我得到的是: import re import sys textout = open("output.txt","w") textblock = open(sys.argv[1]).read() textout.write(re.sub("[a-z]\z","[a-z] ", text

我对Python是一个完全的新手,我被一个正则表达式问题困住了。我试图删除文本文件中每行末尾的换行符,但仅当它紧跟在小写字母之后时,即
[a-z]
。如果行尾以小写字母结尾,我想用空格替换换行符/换行符

到目前为止,我得到的是:

import re
import sys

textout = open("output.txt","w")
textblock = open(sys.argv[1]).read()
textout.write(re.sub("[a-z]\z","[a-z] ", textblock, re.MULTILINE) )
textout.close()
试一试


re.sub(r)(?作为替代答案,虽然它需要更多行,但我认为以下内容可能更清楚,因为正则表达式更简单:

import re
import sys

with open(sys.argv[1]) as ifp:
    with open("output.txt", "w") as ofp:
        for line in ifp:
            if re.search('[a-z]$',line):
                ofp.write(line.rstrip("\n\r")+" ")
            else:
                ofp.write(line)
…这样可以避免将整个文件加载到字符串中。如果希望使用较少的行,但仍然避免正向查找,则可以执行以下操作:

import re
import sys

with open(sys.argv[1]) as ifp:
    with open("output.txt", "w") as ofp:
        for line in ifp:
            ofp.write(re.sub('(?m)([a-z])[\r\n]+$','\\1 ',line))
该正则表达式的部分包括:

  • (?m)
    [打开多行匹配]
  • ([a-z])
    [将单个小写字符匹配为第一组]
  • [\r\n]+
    [匹配一个或多个回车或换行符,以涵盖
    \n
    \r\n
    \r
    ]
  • $
    [匹配字符串的结尾]
…如果与行匹配,小写字母和行尾将替换为
\\1
,这将使小写字母后跟空格。

我的观点是,避免使用正向查找可能会使代码更可读

好吧。不过,就我个人而言,我并不觉得它可读性差。这是品味的问题

在编辑中:

  • 首先,(?m)不是必需的,因为在ifp中,对于行:一次选择一行,因此每行字符串的末尾只有一个换行符

  • 其次,$在放置时没有任何实用程序,因为它将始终匹配字符串行的末尾

无论如何,从你的观点来看,我找到了两种方式来避免后面的断言:

with open(sys.argv[1]) as ifp:
    with open("output.txt", "w") as ofp:
        for line in ifp:
            ante_newline,lower_last = re.match('(.*?([a-z])?$)',line).groups()
            ofp.write(ante_newline+' ' if lower_last else line)

第二个更好:只有一行,一个简单的匹配测试,不需要组(),自然逻辑


编辑:哦,我意识到这第二个代码只是你第一个用一行重写的代码,Longair

我将用
\r?\n
替换
[\r\n]+
要同时点击single
\r
@ThiefMaster,它还将删除空行,btw@ThiefMaster当前位置:是否仍有使用
\r
的Mac电脑,Python是否在其上运行?我以为苹果放弃了OSX的
\r
行结尾,但我可能对此完全错了。希望不是..但你永远不会知道什么是蹩脚的files是存在的-有太多的文件包含
\n
\r\n
的混合,所以我希望一些
\r
文件仍然存在。所以
[\r\n]{1,2}
就可以了,或者根据我的说法更好:
(\n\r\n?)
其中单独测试
\r
的可能性是第三个要测试的(?@eyquem:当然,但我的观点是,避免使用正向查找可能会使代码更具可读性,而且三行额外的代码可能是值得的……好吧,我还是要添加另一个版本。如果RE中没有
$
^
,那么就不需要标记
RE.MULTILINE
with open(sys.argv[1]) as ifp:
    with open("output.txt", "w") as ofp:
        for line in ifp:
            ante_newline,lower_last = re.match('(.*?([a-z])?$)',line).groups()
            ofp.write(ante_newline+' ' if lower_last else line)
with open(sys.argv[1]) as ifp:
    with open("output.txt", "w") as ofp:
        for line in ifp:
            ofp.write(line.strip('\r\n')+' ' if re.search('[a-z]$',line) else line)