2015-05-20 5 views
-1

Я пытаюсь удалить свою беседу из файла журнала чата и анализировать данные других лиц. Когда я загрузить файл в Python, как это:Python - Удалить условные строки файла журнала чата

with open(chatFile) as f: 
    chatLog = f.read().splitlines() 

Данные загружаются как это (гораздо больше, чем, например):

'My Name', 
'08:39 Chat data....!', 
'Other person's name', 
'08:39 Chat Data....', 
'08:40 Chat data..., 
'08:40 Chat data...?', 

Я хотел бы, чтобы выглядеть следующим образом:

'Other person's name', 
'08:39 Chat Data....', 
'08:40 Chat data..., 
'08:40 Chat data...?', 

Я думал об использовании, если заявление с регулярными выражениями:

name = 'My Name' 
for x in chatLog: 
    if x == name: 
     "delete all data below until you get to reach the other 
     person's name" 

Я не мог заставить этот код работать должным образом, любые идеи?

+1

Почему это не работает? это кажется правильным! –

+0

Я не могу понять, как правильно «удалить все данные ниже, пока вы не достигнете имени другого человека». Имя другого человека - это список, которого я не знаю заранее. –

+0

Что вы на самом деле пробовали? Вышеприведенный фрагмент не использует регулярные выражения и, очевидно, не работает. – wflynny

ответ

3

Я думаю, вы неправильно поняли, что означает «регулярные выражения» ... Это не значит, что вы можете просто написать инструкции на английском языке, и интерпретатор python поймет их. Либо это, либо вы использовали псевдокод, что делает невозможным отладку.

Если у вас нет имени другого человека, мы можем предположить, что оно не начинается с числа. Предполагая, что все строки, имя не делать начинается с числа, как в вашем примере:

name = 'My Name' 
skipLines = False 
results = [] 
for x in chatLog: 
    if x == name: 
     skipLines = True 
    elif not x[0].isdigit(): 
     skipLines = False 

    if not skipLines: 
     results.append(x) 
+1

хороший ответ, пожалуйста, избегайте внутренней цитаты. – Wyrmwood

+0

да только что заметил - спасибо! – Kimberly

+0

Спасибо! Я использовал псевдокод, который затрудняет отладку, мои извинения. Однако я решил это, используя вариацию вашего кода. Я изменил: elif x! = Name: # (так как я не всегда знаю имя другого человека) skipLines = Flase –

0
others = [] 
on = True 
for line in chatLog: 
    if not line[0].isdigit(): 
     on = line != name 
    if on: 
     others.append(line) 
+0

Пожалуйста, объясните, как это решает проблему, а не просто отбрасывает код. –

+0

Пожалуйста, объясните, как объяснить тривиальный самоочевидный код. Кроме того, если у вас есть проблема с пониманием этого, скажите мне, какую часть вы не понимаете. Я просто не буду объяснять что-то тривиальное без уважительной причины, если вы даже не хотите говорить, с какой частью у вас проблемы. –

0

Вы можете удалить все сообщения, используя re.sub с пустой строкой в ​​качестве второго аргумента, который является ваша замена строка.

Предполагая, что каждое сообщение чата начинается с новой строки, начинающейся с отметки времени, и что имя не может начинаться с цифры, шаблон регулярного выражения re.escape(yourname) + r',\n(?:\d.*?\n)*' должен соответствовать всем вашим сообщениям, а затем эти соответствия можно заменить на пустая строка.

import re 

with open(chatfile) as f: 
    chatlog = f.read() 
    yourname = 'My Name' 
    pattern = re.escape(yourname) + r',\n(?:\d.*?\n)*' 
    others_messages = re.sub(pattern, '', chatlog) 
    print(others_messages) 

Это будет работать, чтобы удалять сообщения любого пользователя из любого журнала чата, в котором болтается произвольное число пользователей.

Смежные вопросы