swanseabrian 发表于 2021-9-14 10:07:13

删除文本中正则匹配的内容要怎么处理

删除文本中正则匹配的内容要怎么处理
下面是文本中的内容
日用品{<_B4_>}雨伞
药品{<_R34_>}维生素C
生鲜{<_W32_>}鱼
衣服{<_ZA52_>}蓝球衣
鞋服{<_B41_>}球鞋
面包类{<_V23_>}长棍
我要把这文本的内容变成下面这样
日用品雨伞
药品维生素C
生鲜鱼
衣服蓝球衣
鞋服球鞋
面包类长棍
这个要怎么弄呢,
我可 以正则出来
但删除的时候,不知道怎么弄了,用w就只能写入一个别的会覆盖,用a 会追加到后面,不知道要怎么删除以前的内容呢,谢谢

suchocolate 发表于 2021-9-14 10:15:28

重新打开即可
import re

with open('test.txt', encoding='utf-8') as f:
    txt = f.read()
result = re.sub(r'\{.*?\}', '', txt)
with open('test.txt', 'w', encoding='utf-8') as f:
    f.write(result)

swanseabrian 发表于 2021-9-14 11:39:08

suchocolate 发表于 2021-9-14 10:15
重新打开即可

一次写入,厉害,我用的是readline.一行一行读的,。。。。所以搞半天也不行

swanseabrian 发表于 2021-9-16 15:57:53

suchocolate 发表于 2021-9-14 10:15
重新打开即可

你好,我再请教一下,这样写回去,每一行下面多了一个空行,这个如果在这个txt文件里可以解决吗?我不想写到另外的txt里去,网上有去掉空行,就是写到另外的txt文件里去,不知道为什么正则 匹配出来的数据写回去有空行了,谢谢

suchocolate 发表于 2021-9-16 16:06:30

swanseabrian 发表于 2021-9-16 15:57
你好,我再请教一下,这样写回去,每一行下面多了一个空行,这个如果在这个txt文件里可以解决吗?我不想 ...

我这执行没有出现空格。请把你那用的代码贴出来。

swanseabrian 发表于 2021-9-16 16:59:12

suchocolate 发表于 2021-9-16 16:06
我这执行没有出现空格。请把你那用的代码贴出来。

日用品雨伞

药品维生素C

生鲜鱼

衣服蓝球衣

鞋服球鞋

面包类长棍 这是写进去的效果,可以去掉空行吗

swanseabrian 发表于 2021-9-16 17:01:20

suchocolate 发表于 2021-9-16 16:06
我这执行没有出现空格。请把你那用的代码贴出来。

file = open(r"C:\Users\Administrator\Desktop\vbs\删除{}及里面内容测验用文件\专用测验\43∑44.txt",'rb')

rb = file.read()
f_charInfo = chardet.detect(rb)
neirong = rb.decode(f_charInfo['encoding'])
m = pattern.sub('', neirong)
print(m)

with open(r"C:\Users\Administrator\Desktop\vbs\删除{}及里面内容测验用文件\专用测验\43∑44.txt",'w') as f1:

    f1.write(m)
这样的

suchocolate 发表于 2021-9-16 17:42:17

swanseabrian 发表于 2021-9-16 17:01
这样的

请发出全部的代码,和全部的用到的txt。

swanseabrian 发表于 2021-9-16 17:51:55

suchocolate 发表于 2021-9-16 17:42
请发出全部的代码,和全部的用到的txt。

import re
import os
from tkinter import *
import chardet
from tkinter.filedialog import askdirectory
from tkinter.filedialog import askopenfilename


pattern = re.compile(r'{.*?}')

file = open(r"C:\Users\Administrator\Desktop\vbs\删除{}及里面内容测验用文件\专用测验\43∑44.txt",'rb')



rb = file.read()
f_charInfo = chardet.detect(rb)
print(f_charInfo)# 输出文本格式信息
print(f_charInfo['encoding'])# 取得文本格式
print(rb.decode(f_charInfo['encoding']))# 通过取得的文本格式读取txt
neirong = rb.decode(f_charInfo['encoding'])
m = pattern.sub('', neirong)
print(m)


with open(r"C:\Users\Administrator\Desktop\vbs\删除{}及里面内容测验用文件\专用测验\43∑44.txt",'w') as f1:

    f1.write(m)

swanseabrian 发表于 2021-9-16 17:52:35

suchocolate 发表于 2021-9-16 17:42
请发出全部的代码,和全部的用到的txt。

链接:https://pan.baidu.com/s/1pWmVImlwwJvJs-KMOl4EmA
提取码:1111
这是TXT

suchocolate 发表于 2021-9-16 18:22:06

本帖最后由 suchocolate 于 2021-9-16 18:26 编辑

import re
import chardet


with open('test.txt', 'rb') as f:# 检测编码类型,用with open打开文件,python会自动关闭文件,避免忘记关闭文件。刚刚你的代码没有关闭文件。
    rb = f.read()
code = chardet.detect(rb)['encoding']

with open('test.txt', encoding=code) as f:# 用检测到的再打开一次,获取文本内容并替换。
    txt = f.read()
result = re.sub(r'\{.*?\}', '', txt)

with open("test.txt", 'w', encoding='utf-8') as f:# 向文本写入,旧的会被擦除。
    f.write(result)

swanseabrian 发表于 2021-9-16 18:49:19

suchocolate 发表于 2021-9-16 18:22


哎呀,真的是,不关闭就多换行呀,这么奇怪吗

swanseabrian 发表于 2021-9-17 09:38:36

suchocolate 发表于 2021-9-16 18:22


不是呀,我循环操作就出问题,不循环单独操作一个没问题,百度网盘的链接审核通过了,您 看可以测试一下吗,循环操作一下看会不会有空格 ,谢谢

swanseabrian 发表于 2021-9-17 10:18:03

suchocolate 发表于 2021-9-16 18:22


from tkinter.filedialog import askdirectory
from tkinter.filedialog import askopenfilename

import tkinter.messagebox


def selectfile():


dir1 = askdirectory()


pattern = re.compile(r'{.*?}')


for file in os.listdir(dir1):
      if os.path.isfile(os.path.join(dir1, file)) == True:
          filepath = os.path.join(dir1, file)
          with open(filepath, 'rb') as f:
            rb = f.read()
            f_charInfo = chardet.detect(rb)
   
            neirong = rb.decode(f_charInfo['encoding'])
            m = pattern.sub('', neirong)
            with open(filepath, "w" ) as f1:
                  f1.write(m)
tkinter.messagebox.showinfo('提示', '操作完成')

root = Tk()
root.title('删除大括号')
root.resizable(0,0)
root.geometry('250x150')
Button(root, text = "路径选择", command = selectfile).pack()

root.mainloop()
这是全部代码

suchocolate 发表于 2021-9-17 22:04:39

swanseabrian 发表于 2021-9-17 10:18
这是全部代码

from tkinter.filedialog import askdirectory
import tkinter.messagebox
from tkinter import *
import os
import chardet


def selectfile():
    dir1 = askdirectory()
    pattern = re.compile(r'{.*?}')
    for file in os.listdir(dir1):
      if os.path.isfile(os.path.join(dir1, file)):
            filepath = os.path.join(dir1, file)
            with open(filepath, 'rb') as f:
                rb = f.read()
            code = chardet.detect(rb)['encoding']
            with open(filepath, encoding=code) as f:
                m = pattern.sub('', f.read())
            with open(filepath, "w") as f:
                f.write(m)
    tkinter.messagebox.showinfo('提示', '操作完成')


root = Tk()
root.title('删除大括号')
root.resizable(0, 0)
root.geometry('250x150')
Button(root, text="路径选择", command=selectfile).pack()

root.mainloop()

swanseabrian 发表于 2021-9-18 08:21:48

suchocolate 发表于 2021-9-17 22:04


老铁。为什么会是这句的问题 rb.decode,这上句造成的 多空行,神奇啊

suchocolate 发表于 2021-9-18 10:20:15

本帖最后由 suchocolate 于 2021-9-18 10:21 编辑

swanseabrian 发表于 2021-9-18 08:21
老铁。为什么会是这句的问题 rb.decode,这上句造成的 多空行,神奇啊

通过尝试发现,用rb方式读取的文本经过decode后再写入文件,就会出现这个问题,如果是r方式读取再写入就不会。
你可以用以下两种代码尝试一下:

1. rb decode方式:import re

with open('32424.txt', 'r') as f:
    print('32424.txt 原始内容 f.readlines():', f.readlines())
    print('=' * 100)

with open('32424.txt', 'rb') as f:
    txt = f.read().decode('gbk')
    print('以rb方式读取decode之后内容', repr(txt))
    print('=' * 100)
    w = re.sub(r'\{.*?\}', '', txt)
    print('替换后:', repr(w))
    print('=' * 100)

with open('32424_result1.txt', 'w') as f:
    f.write(w)

with open('32424_result1.txt') as f:
    print('32424_result1.txt f.readlines():', f.readlines())
    print('=' * 100)


2. r 方式:
import re

with open('32424.txt', 'r') as f:
    print('32424.txt 原始内容 f.readlines():', f.readlines())
    print('=' * 100)

with open('32424.txt', 'r') as f:
    txt = f.read()
    w = re.sub(r'\{.*?\}', '', txt)
    print('替换后:', repr(txt))
    print('=' * 100)

with open('32424_result2.txt', 'w') as f:
    f.write(w)

with open('32424_result2.txt') as f:
    print('32424_result2.txt f.readlines():', f.readlines())
    print('=' * 100)


如果想规避这个问题,可以在rb方式保存文件时,使用newline=''参数:with open('32424_result1.txt', 'w', newlin='') as f:
    f.write(w)

swanseabrian 发表于 2021-9-18 10:55:12

suchocolate 发表于 2021-9-18 10:20
通过尝试发现,用rb方式读取的文本经过decode后再写入文件,就会出现这个问题,如果是r方式读取再写入 ...

我还是不用decode了吧,谢谢,大神
页: [1]
查看完整版本: 删除文本中正则匹配的内容要怎么处理