2015-05-20 58 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) 

這將努力從那裏用戶任意數量的正聊着任何聊天記錄刪除任何用戶的消息。