python正则去除换行符,关于python:用于删除换行符的正则表达式
我是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中沒有$且沒有^,則不需要標記re.MULTILINE
嘗試
re.sub(r"(?<=[a-z])
?
","", textblock)
\Z僅匹配字符串末尾,在最后一個換行符之后,所以它絕對不是你需要的。 Python正則表達式引擎無法識別\Z。
(?<=[a-z])是一個正向的lookbehind斷言,用于檢查當前位置之前的字符是否為小寫ASCII字符。只有這樣,正則表達式引擎才會嘗試匹配換行符。
此外,始終使用帶有正則表達式的原始字符串。使反斜杠更容易處理。
你是對的! ;)
我會用[
]+替換?以命中單個。
@ThiefMaster,它也會刪除空行,順便說一句
@ThiefMaster:周圍仍然有Mac使用,并且Python上運行嗎?我以為Apple放棄了OS X的行結尾,但我可能完全錯了。
希望不是..但你永遠不知道有什么糟糕的文件 - 有太多的文件包含和的混合所以我希望一些文件仍然存在。
所以[
]{1,2}會根據我的情況做得更好:(
|
?),其中的可能性是第三個被測試的可能性。
@eyquem:肯定是第二個:(?:
|
?),或者你可能偶然刪除兩個相鄰的Unix換行符。
順便說一句,這個RE絕對不需要原始字符串。而\Z匹配字符串的結尾,而不是更低
哦,是的。你的?:不需要。
@eyquem:使用原始字符串總是很好的做法。你知道哪些反斜杠逃脫是必要的,哪些不是?這只是消除了一個常見的錯誤來源。如果我不打算捕獲其內容,我也總是喜歡非捕獲括號。不僅僅是出于效率原因,而是為了清晰起見,并且因為一些Python正則表達式操作在捕獲parens時表現得非常不同。關于\Z和\Z,你適合使用Python - 我發現Python沒有實現Perl,.NET,PCRE等常用的行為。
@Tim Pietzcker我不喜歡表達"永遠"真理的句子。 Personnaly,我寧愿不使用原始字符串:這迫使我理解我寫的內容并記住我的理解。在正則表達式中沒有那么多的逃避,我記得更常見的,另一個我驗證。這是一個品味問題。我擔心RE中使用raw-string會阻止新手真正理解正則表達式編譯器對RE的解釋。
作為一個替代答案,雖然它需要更多的行,但我認為以下可能更清楚,因為正則表達式更簡單:
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("
")+"")
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])[
]+$','\\1 ',line))
正則表達式的部分是:
(?m) [開啟多線匹配]
([a-z]) [將單個小寫字符作為第一組匹配]
[
]+ [匹配一個或多個回車符或換行符,以涵蓋,和]
$ [匹配字符串的結尾]
...如果匹配行,則小寫字母和行結尾將替換為\\1,小寫字母后跟空格。
一行ofp.write(re.sub("(?<=[a-z])(
|
?)","",line)而不是四行
@eyquem:當然,但我的觀點是避免使用正面的lookbehind可能會使代碼更具可讀性,而且額外的三行可能是值得的......好吧,我還是會添加另一個版本。
我的觀點是避免使用正面的lookbehind可能會使代碼更具可讀性
好。雖然,就個人而言,我發現它的可讀性不高。這是一個品味問題。
在你的編輯中:
首先,(?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)
和
with open(sys.argv[1]) as ifp:
with open("output.txt","w") as ofp:
for line in ifp:
ofp.write(line.strip('
')+' ' if re.search('[a-z]$',line) else line)
第二個更好:只有一行,一個簡單的匹配測試,不需要groups(),自然邏輯
編輯:哦,我意識到第二個代碼只是你的第一個代碼重寫在一行,Longair
總結
以上是生活随笔為你收集整理的python正则去除换行符,关于python:用于删除换行符的正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ida 数据操作
- 下一篇: 鸡肋的 Nero BurnLite 10