我有一个工作项目,我正在尝试编写一些Python代码来自动执行每月需要的数据集。我在随机文本文件中大约有300-400条不同的记录。我无法修改每月发送给我的数据的方式,但我需要将其中的一半拉近到一个单独的文本文件中,以移交给其他人。过去,我们一直在手动拆分它们,但我很想实现此过程的自动化。我对python很陌生,希望在编写此脚本的过程中学习。
我编写了一个小脚本,该脚本使用正则表达式提取每个部分,然后使用第二个正则表达式确定它是否适合放置在单独文件中的条件。但是,我只写了一行而不是整个部分。我进行了多次更改,似乎无法弄清楚是什么让我能够拉整个第一场比赛,而不仅仅是第二场比赛。
pattern = re.compile('^START[\S\s]*END$',re.MULTILINE)
ccgjju = re.compile('WNO/CC[\S\s]',re.MULTILINE)
filetowrite = 'ccgjju.txt'
tempFile = open(filetowrite, 'a' )
for pattern in open('source.txt'):
if ccgjju.match(pattern):
tempFile.write(pattern)
tempFile.close()
我的源文件包含300-500条与此类似的记录
START
NAME/SMITH,JOHN SEX/M RAC/W
MIS/RANDOM INFORMATION
WNO/CC124589 DAT/01012019
ADDR/121 MAIN ST
END
START
NAME/THOMPSON,JOHN SEX/M RAC/W
MIS/RANDOM INFORMATION
WNO/DC0123456 DAT/01012019
ADDR/121 MAIN ST
END
START
NAME/THOMAS,JOHN SEX/M RAC/W
MIS/RANDOM INFORMATION
WNO/CC01234 DAT/01012019
ADDR/121 MAIN ST
END
如果WNO / CC行具有WNO / CC而不是WNO / DC,我希望它在START和END之间拉动所有内容。当前,它将以下内容返回到输出文件,而不是两者之间的整个记录。
WNO/CC124589 DAT/01012019
WNO/CC01234 DAT/01012019
答案 0 :(得分:2)
由于您正在逐行阅读,因此您不会碰到一场比赛。试试:
with open('source.txt') as f:
s = f.read()
# get the blocks between START and END
blocks = re.findall(r'START([\s\S]*?)END', s, re.M)
# same as
blocks = re.findall(r'START(.*?)END', s, re.M|re.S)
# get the blocks that match WNO/CC
res = [b for b in blocks if re.findall(r'WNO/CC', b)]
使用*?
来获得最短匹配而不是贪婪匹配。