2017-10-18 77 views
0

我有充滿用戶的意見(從網頁抓取)我已經被拉入蟒蛇與大熊貓Python3正則表達式不改變「爲」

import pandas as pd 

data = pd.DataFrame(pd.read_json(filename, orient=columnName,encoding="utf-8"),columns=columnName) 
data['full_text'] = data['full_text'].replace('^@ABC(\\u2019s)*[ ,\n]*', '', regex=True) 
data['full_text'] = data['full_text'].replace('(\\u2019)', "'", regex=True) 
data.to_json('new_abc_short.json',orient='records') 

的消息並不完全匹配相應的JSON文件在線消息。 (emojis顯示爲\ u0234或其他東西,撇號爲\ u2019,鏈接中有正斜槓,並且引號有反斜槓。

我想清理它們,所以我學會了一些正則表達式,所以我可以拉進python,clean (https://docs.python.org/3/howto/regex.html

第二行有助於刪除嘰嘰喳喳句柄(如果它只存在於開始),然後刪除它的,如果它是(如果它是)如果在開始時沒有twitter句柄(可能在消息的中間使用),那麼它會被保留,然後它將刪除所有留下的空格和逗號(再次僅在字符串) 例如「@ABC,hi there」變成「hi there」。「hi there @ABC」保持不變。 「@ ABC的Twitter是大」將成爲「Twitter是大」

第三行有助於替換無法顯示每一個單引號(如唐\ u2019t變回不)

我有上千條記錄(不是所有的人都用撇號,報價,鏈接等問題),以及基於非常小例子我看,他們似乎工作

,但我的第三個不工作:

data['full_text'] = data['full_text'].replace('\\"', '"', regex=True) 

json中的示例消息:「full_text」:「@ ABC你怎麼能」意外關閉了\「我的帳戶」

我想刪除\旁邊的雙引號,所以它看起來像真正的信息(我假設它是用戶顯然沒有鍵入一個轉義字符)

但無論我做什麼,我都無法刪除它

從我的正則表達式學習,「不是一個元字符。所以反斜槓甚至不應該在那裏。但無論如何,我已經試過:

\\" (which i think should be the obvious one, i have \", no special quirk in " but there is in \ so i need another back slash to escape that) 
\\\\" (some forums posts online mention needing 4 slashes 
\\\" (i think someone mention in the forum posts that they got it workin with 3) 
\\\(\") (i know that brackets provide groupings so i tried different combinations) 
(\\\\") 

上述所有表達我的單引號包裹,他們沒有工作。我想,也許雙引號是問題,因爲我只有一個,所以我取代了單引號用單引號X3

'''\\"''' 

但沒有上述工作了三聯單引號或者

我一直複覈新保存的JSON和我總是看到:

「full_text」:「你怎麼可以\」不小心關閉了\「我的賬戶」 (即間隙除去@ABC工作,但不是反斜槓位)

最初,我三編輯調查轉換這些unicode問題,即使用encoding =「utf-8」)雖然我在這方面的經驗是有限的,它保持失敗,所以正則表達式是我最好的選擇

+1

這樣做幾乎肯定是錯誤的方法。更好的辦法是找到額外的轉義級別,並使用相同的工具來避開字符串。 –

+0

@DanielH如果通過工具,你是指什麼提供的數據,然後保存到json,那麼這將通過刮twitter?所以我想我無法從Twitter方面做任何事情? – user3120554

+0

等等......當你說'print(data ['full_text'])'時,你會得到什麼? –

回答

1

噢,我錯過了熊貓提示,所以熊貓取代確實使用正則表達式。但是,要明確,str.replace不適用於正則表達式。 re.sub呢。

現在

  • 匹配單個反斜槓,你的正則表達式是:"\\"
  • 字符串來描述正則表達式:"\\\\"使用原始字符串時
  • ,一個雙反斜線是不夠的:r'\\'

如果您的字符串真的包含\先導納克",正則表達式會做的是:

\\(?=\") 

它做了前瞻您"(請看regex101)。

你將不得不使用這樣的:

re.sub(r'\\(?=\")',"",s,0) 

或使用正則表達式一個熊貓等同。

+0

我使用的原始json(在我將它加載到python之前),如果我在記事本++中打開它,並且發現該推文,我會在引號標記之前看到退格(我檢查了幾個不同的推文,來自同一個問題)。我不太清楚我是否理解了\\(?= \「),儘管編譯器抱怨在位置5的括號不平衡,我用它替換了我的表達式(用單引號括起來)?(有點愚蠢,但是如果我如果我修正了錯誤,但是當我檢查新的json時,反斜槓仍然存在:( – user3120554

+0

,如果我明白表達式正確\\(?= \「),從我的鏈接,your'e匹配(基於(?= ...)第一個也是唯一的實例。「但我不確定這兩個\除了刪除第二個\ ,導致表達式搜索r \\「我也注意到在外面反斜槓的數量似乎控制了括號錯誤 – user3120554

+0

我甚至試圖用re.sub作爲匿名函數,但它沒有工作:(數據[ 'full_text'] = data ['full_text']。apply(lambda x:re.sub(r'\\(?= \「)',''',x)) – user3120554