我现在正面临一个问题。我试图写一个正则表达式代码,以匹配文本文件中的模式,并找到它后,从当前文本中删除它。
# Reading the file data and store it
with open('file.txt','r+') as f:
file = f.read()
print(file)
这是我打印的文本
'{ntINFOtDATA_NUMBERt974nt{nttDAT_CQFDntt{ntttsome random text t787878ntt}nttDATA_TO_MATCHntt{ntt1tbunch of characters t985ntt2tbunch of datatt78ntt}nt}ntINFOtDATA_CATCHMEt123nt{ntt3tbunch of characters ntt2tbunch of datasnt}ntINFOtDATA_INTACTtt456nt{ntt3tbunch of numbers ntt2tbunch of textsnt}nn'
下面是用编辑器打开的同一文本的图片:图片在这里我想匹配/搜索DATA_TO_MATCH,然后寻找最后一个右括号"}";然后去掉这个右括号和下一个括号之间的所有东西。我想对DATA_CATCHME做同样的事情。
下面是预期的结果:
'{ntINFOtDATA_NUMBERt974nt{nttDATA_CQFDntt{ntttsome random text t787878ntt}nnt}ntINFOtDATA_INTACTtt456nt{ntt3tbunch of numbers ntt2tbunch of textsnt}nn}n'
下面是用编辑器打开的相同文本结果的图片:图像在这里
I tried some
import re
#find the DATA_TO_MATCH
re.findall(r".*DATA_TO_MATCH",file)
#find the DATA_CATCHME
re.findall(r".*DATA_CATCHME",file)
#supposed to find everything before the closed bracket "}"
re.findall(r"(?=.*})[^}]*",file)
但是我不是很熟悉regex和re,我不能得到我想要的,我想当我找到它的时候我会用
re.sub(my_patern,'', text)
将它从我的文本文件中删除
这里的主要技巧是使用re.MULTILINE
标志,它将跨行。你也应该直接使用re.sub
而不是re.findall
。
一旦你理解了正则表达式,它本身就很简单。查找DATA_TO_MATCH
之前的所有字符,然后清除可能存在的任何空白(因此是*
),读取{
,然后读取所有不是}
的字符,最后使用}
。第二种策略非常相似。
import re
with open('input.txt', 'r+') as f:
file = f.read()
# find the DATA_TO_MATCH
file = re.sub(r".*DATA_TO_MATCHs*{[^}]*}", "", file, flags=re.MULTILINE)
# find the DATA_CATCHME
file = re.sub(r".*DATA_CATCHME[^{]*{[^}]*}", "", file, flags=re.MULTILINE)
print(file)