首页 > 解决方案 > 在一条线下找到一条线

问题描述

我正在为自己开发一个小程序,但在查找新文件中特定行下的写入行时遇到问题。

更具体地说,我有一个基本上是聊天记录的文件,第一行是一个人的名字,第二行是消息,第三行是另一个人的名字,等等。

聊天是这样进行的(出于隐私原因审查的消息):

Name1 Firstname1
Message sent by Name1 Firstname1
Name2 Firstname2
Message sent by Name2 Firstname2
Name1 Firstname1
Message sent by Name1 Firstname1
Name1 Firstname1
Message sent by Name1 Firstname1

如您所见,顺序可以是随机的,因为有人可以连续发送多条消息。

我试图这样做:

import re

def Sep(Source, OutputA):
    with open(Source, 'r', encoding='utf8', errors='ignore') as fdin:
        temp = fdin.readlines()
    regex = re.compile(r"^(Name)+ (FirstName)")
    result = [x for x in temp if regex.search(x)]
    with open(OutputA, 'w', encoding='utf8', errors='ignore') as fdout:
        fdout.writelines(result)

Sep('chat.txt','Results.txt')

我的Results.txt中的这个输出'Name FirstName',我想要做的是在Results.txt中的Name FirstName之后输出行。任何线索将不胜感激!提前致谢。

标签: pythonpython-3.x

解决方案


你可以这样做:

import re

def Sep(Source, OutputA, user_name, user_firstname):
    with open(Source, 'r', encoding='utf8', errors='ignore') as fdin:
        text = fdin.read()

    matches = re.finditer("^({}) ({})\n(.*)".format(user_name,user_firstname),text, re.MULTILINE)
    with open(OutputA, 'w', encoding='utf8', errors='ignore') as fdout:
        for match in matches:
            fdout.write(match.group(3))
            fdout.write("\n")

Sep('chats.txt','Results.txt', "Name1","Firstname1")

输出:

Message sent by Name1 Firstname1
Message sent by Name1 Firstname1
Message sent by Name1 Firstname1

推荐阅读