搜索字符串并在python中从上面的一行打印到另一个搜索字符串

2024-09-28 22:22:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下文件(temp1文件):

Basket1
10 Pens I have in Packet1
20 Books I have in Packet1
30 Red pens I have in Packet1
End here
Basket1
10 apples I have in Packet2
20 Mangos I have in Packet2
30 oranges I have in Packet2.
End here

我已经写了下面的代码,它将搜索开始行和结束行和打印行之间包括开始和结束行。你知道吗

start_line = "Pens I have"
end_line = "End here"
print_lines = False
with open('temp1' , 'r') as f:
    for line in f:
        line = line.strip()
        if (re.search(start_line, line)):
            print_lines = True
        if print_lines:
            temp = open("temp2", 'a')
            sys.stdout = temp
            print line
        if (re.search(end_line, line)):
            print_lines = False
            temp.close()
            sys.stdout = sys.__stdout__

我得到的输出:

10 Pens I have in Packet1
20 Books I have in Packet1
30 Red pens I have in Packet1
End here    

我需要帮助打印行到文件temp2从上面一行从开始行到结束行。下面是文件temp2的预期输出。你知道吗

Basket1
10 Pens I have in Packet1
20 Books I have in Packet1
30 Red pens I have in Packet1
End here

Tags: 文件inherehavelineredbooksend
2条回答

因为你需要Basket1来打印,所以你的start_line必须是Basket1,而在第一行之后,你需要Pens I have我把它用作“中间行”

import sys
import re

start_line = "Basket1"
mid_line = "Pens I have"
end_line = "End here"
print_lines = False

start_index = None
start_data = None
temp = None

with open('temp1' , 'r') as f:
    for index, line in enumerate(f):
        line = line.strip()

        # Search for start_line, and store it's index and value
        if (re.search(start_line, line)):
            start_data = line
            start_index = index

        # If you find "Pens I have", and it's under start_line then store start_line
        if (re.search(mid_line, line)):
            if start_index + 1 == index:
                temp = open("temp2", 'a')
                sys.stdout = temp
                print start_data
                print_lines = True
        if print_lines:
            temp = open("temp2", 'a')
            sys.stdout = temp
            print line
        if (re.search(end_line, line)):
            print_lines = False
            if temp and hasattr(temp, 'read'):
                temp.close()
            sys.stdout = sys.__stdout__

您可以使用正则表达式搜索字符串,使用它读取和写入文件,您可以执行以下操作:

import re

with open('temp1' , 'r') as f1, open('temp2' , 'a') as f2:
    results = re.findall('\w+\n10 Pens I.*?End here', f1.read(), re.DOTALL)
    f2.writelines(results)

示例:

import re

s = '''Basket1
10 Pens I have in Packet1
20 Books I have in Packet1
30 Red pens I have in Packet1
End here
Basket1
10 apples I have in Packet2
20 Mangos I have in Packet2
30 oranges I have in Packet2.
End here'''

# use re.findall if you want to match multiple times
result = re.search('\w+\n10 Pens I.*?End here', s, re.DOTALL)

# only print(result) if using re.findall
print(result.group())

# output:

Basket1
10 Pens I have in Packet1
20 Books I have in Packet1
30 Red pens I have in Packet1
End here

相关问题 更多 >