使用 Python 删除所有匹配正则表达式的行
Posted
技术标签:
【中文标题】使用 Python 删除所有匹配正则表达式的行【英文标题】:Using Python to Remove All Lines Matching Regex 【发布时间】:2013-06-17 18:21:23 【问题描述】:我正在尝试删除我的正则表达式匹配的所有行(正则表达式只是寻找任何包含雅虎的行)。每个匹配项都在自己的行上,因此不需要多行选项。
这就是我目前所拥有的......
import re
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8")
inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile))
inputfile.close()
我收到以下错误:
Traceback(最近一次调用最后一次): 第 170 行,在子 return _compile(pattern, flags).sub(repl, string, count) TypeError: 预期的字符串或缓冲区
【问题讨论】:
那么问题出在哪里? 您没有读取文件。你需要类似inputfile.readlines()
您试图关闭 2 个您从未打开过的文件,并且将打开的文件命名为写入 inputfile
充其量是令人困惑的。
... 和 re.sub
是关于替换字符串的匹配内容。不测试字符串 match.
我正在尝试用任何内容替换匹配的内容,因此是“”。
【参考方案1】:
如果要修改原始文件,请使用fileinput
模块:
import re
import fileinput
for line in fileinput.input(r'C:\temp\Scripts\remove.txt', inplace = True):
if not re.search(r'\byahoo\b', line):
print(line, end="")
【讨论】:
它在仍然存在的文本之间添加新行。有关如何避免这种情况的任何提示? 我试过打印线,打印(线,)和打印(线),似乎都不起作用。 @user2506096 在 py3.x 上使用print(line, end = "")
@JonClements 感谢您的输入,由于互联网连接不佳,我无法回复,看起来您处理了所有事情。 :)
注意:您不能同时使用inplace=1
和fileinput.hook_encoded()
,因此如果您需要使用默认@987654327 以外的编码解码文件内容,则基于fileinput
的解决方案将不起作用@.【参考方案2】:
这是@Ashwini Chaudhary's answer 的Python 3 变体,用于从给定filename
中删除所有包含正则表达式pattern
的行:
#!/usr/bin/env python3
"""Usage: remove-pattern <pattern> <file>"""
import fileinput
import re
import sys
def main():
pattern, filename = sys.argv[1:] # get pattern, filename from command-line
matched = re.compile(pattern).search
with fileinput.FileInput(filename, inplace=1, backup='.bak') as file:
for line in file:
if not matched(line): # save lines that do not match
print(line, end='') # this goes to filename due to inplace=1
main()
它假定 locale.getpreferredencoding(False) == input_file_encoding
否则它可能会在非 ascii 字符上中断。
无论当前的语言环境是什么或对于具有不同编码的输入文件,它都能正常工作:
#!/usr/bin/env python3
import os
import re
import sys
from tempfile import NamedTemporaryFile
def main():
encoding = 'utf-8'
pattern, filename = sys.argv[1:]
matched = re.compile(pattern).search
with open(filename, encoding=encoding) as input_file:
with NamedTemporaryFile(mode='w', encoding=encoding,
dir=os.path.dirname(filename),
delete=False) as outfile:
for line in input_file:
if not matched(line):
print(line, end='', file=outfile)
os.replace(outfile.name, input_file.name)
main()
【讨论】:
【参考方案3】:你必须阅读文件尝试类似:
import re
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8")
inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile.read()))
file.close()
outputfile.close()
【讨论】:
以上是关于使用 Python 删除所有匹配正则表达式的行的主要内容,如果未能解决你的问题,请参考以下文章