鱼C论坛

 找回密码
 立即注册
查看: 1989|回复: 17

[已解决]删除文本中正则匹配的内容要怎么处理

[复制链接]
发表于 2021-9-14 10:07:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  2. with open('test.txt', encoding='utf-8') as f:
  3.     txt = f.read()
  4. result = re.sub(r'\{.*?\}', '', txt)
  5. with open('test.txt', 'w', encoding='utf-8') as f:
  6.     f.write(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-14 10:15:28 | 显示全部楼层    本楼为最佳答案   
重新打开即可
  1. import re

  2. with open('test.txt', encoding='utf-8') as f:
  3.     txt = f.read()
  4. result = re.sub(r'\{.*?\}', '', txt)
  5. with open('test.txt', 'w', encoding='utf-8') as f:
  6.     f.write(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 11:39:08 | 显示全部楼层

一次写入,厉害,我用的是readline.一行一行读的,。。。。所以搞半天也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 15:57:53 | 显示全部楼层

你好,我再请教一下,这样写回去,每一行下面多了一个空行,这个如果在这个txt文件里可以解决吗?我不想写到另外的txt里去,网上有去掉空行,就是写到另外的txt文件里去,不知道为什么正则 匹配出来的数据写回去有空行了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我这执行没有出现空格。请把你那用的代码贴出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 16:59:12 | 显示全部楼层
suchocolate 发表于 2021-9-16 16:06
我这执行没有出现空格。请把你那用的代码贴出来。

日用品雨伞

药品维生素C

生鲜鱼

衣服蓝球衣

鞋服球鞋

面包类长棍 这是写进去的效果,可以去掉空行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 17:01:20 | 显示全部楼层
suchocolate 发表于 2021-9-16 16:06
我这执行没有出现空格。请把你那用的代码贴出来。
  1. file = open(r"C:\Users\Administrator\Desktop\vbs\删除{}及里面内容测验用文件\专用测验\43∑44.txt",'rb')

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

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

  8.     f1.write(m)
复制代码

这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 17:42:17 | 显示全部楼层

请发出全部的代码,和全部的用到的txt。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 17:52:35 | 显示全部楼层
suchocolate 发表于 2021-9-16 17:42
请发出全部的代码,和全部的用到的txt。

链接:https://pan.baidu.com/s/1pWmVImlwwJvJs-KMOl4EmA
提取码:1111
这是TXT
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 18:22:06 | 显示全部楼层
本帖最后由 suchocolate 于 2021-9-16 18:26 编辑
  1. import re
  2. import chardet


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

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

  9. with open("test.txt", 'w', encoding='utf-8') as f:  # 向文本写入,旧的会被擦除。
  10.     f.write(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 18:49:19 | 显示全部楼层

哎呀,真的是,不关闭就多换行呀,这么奇怪吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 09:38:36 | 显示全部楼层

不是呀,我循环操作就出问题,不循环单独操作一个没问题,百度网盘的链接审核通过了,您 看可以测试一下吗,循环操作一下看会不会有空格 ,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 10:18:03 | 显示全部楼层
  1. from tkinter.filedialog import askdirectory
  2. from tkinter.filedialog import askopenfilename

  3. import tkinter.messagebox


  4. def selectfile():


  5.   dir1 = askdirectory()


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


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

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

  24. root.mainloop()
复制代码

这是全部代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-17 22:04:39 | 显示全部楼层
  1. from tkinter.filedialog import askdirectory
  2. import tkinter.messagebox
  3. from tkinter import *
  4. import os
  5. import chardet


  6. def selectfile():
  7.     dir1 = askdirectory()
  8.     pattern = re.compile(r'{.*?}')
  9.     for file in os.listdir(dir1):
  10.         if os.path.isfile(os.path.join(dir1, file)):
  11.             filepath = os.path.join(dir1, file)
  12.             with open(filepath, 'rb') as f:
  13.                 rb = f.read()
  14.             code = chardet.detect(rb)['encoding']
  15.             with open(filepath, encoding=code) as f:
  16.                 m = pattern.sub('', f.read())
  17.             with open(filepath, "w") as f:
  18.                 f.write(m)
  19.     tkinter.messagebox.showinfo('提示', '操作完成')


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

  25. root.mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-18 08:21:48 | 显示全部楼层

老铁。为什么会是这句的问题 rb.decode,这上句造成的 多空行,神奇啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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方式:
  1. import re

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

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

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

  14. with open('32424_result1.txt') as f:
  15.     print('32424_result1.txt f.readlines():', f.readlines())
  16.     print('=' * 100)
复制代码


2. r 方式:
  1. import re

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

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

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

  12. with open('32424_result2.txt') as f:
  13.     print('32424_result2.txt f.readlines():', f.readlines())
  14.     print('=' * 100)
复制代码


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我还是不用decode了吧,谢谢,大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-1 19:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表