2016-10-02 29 views
4

我試圖從wiki標題轉儲中提取英文標題,該轉儲在文本文件中使用Python 3中的正則表達式。維基轉儲也包含其他語言的標題和一些符號。下面是我的代碼:TypeError:序列項目1:期望一個類似字節的對象,找到str

with open('/Users/some/directory/title.txt', 'rb')as f: 
    text=f.read() 
    letters_only = re.sub(b"[^a-zA-Z]", " ", text) 
    words = letters_only.lower().split() 
print(words) 

但我得到一個錯誤:

TypeError: sequence item 1: expected a bytes-like object, str found 

在該行:letters_only = re.sub(b"[^a-zA-Z]", " ", text)

但是,我使用b''讓儘可能字節類型的輸出,下面是文本文件的示例:

Destroy-Oh-Boy!! 
!!Que_Corra_La_Voz!! 
!!_(chess) 
!!_(disambiguation) 
!'O!Kung 
!'O!Kung_language 
!'O-!khung_language 
!337$P34K 
!= 
!? 
!?! 
!?Revolution!? 
!?_(chess) 
!A_Luchar! 
!Action_Pact! 
!Action_pact! 
!Adios_Amigos! 
!Alabadle! 
!Alarma! 
!Alarma!_(album) 
!Alarma!_(disambiguation) 
!Alarma!_(magazine) 
!Alarma!_Records 
!Alarma!_magazine 
!Alfaro_Vive,_Carajo! 
!All-Time_Quarterback! 
!All-Time_Quarterback!_(EP) 
!All-Time_Quarterback!_(album) 
!Alla_tu! 
!Amigos! 
!Amigos!_(Arrested_Development_episode) 
!Arriba!_La_Pachanga 
!Ask_a_Mexican! 
!Atame! 
!Ay,_Carmela!_(film) 
!Ay,_caramba! 
!BANG! 
!Bang! 
!Bang!_TV 
!Basta_Ya! 
!Bastardos! 
!Bastardos!_(album) 
!Bastardos_en_Vivo! 
!Bienvenido,_Mr._Marshall! 
!Ciauetistico! 
!Ciautistico! 
!DOCTYPE 
!Dame!_!Dame!_!Dame! 
!Decapitacion! 
!Dos! 
!Explora!_Science_Center_and_Children's_Museum 
!F 
!Forward,_Russia! 
!Forward_Russia! 
!Ga!ne_language 
!Ga!nge_language 
!Gã!ne 
!Gã!ne_language 
!Gã!nge_language 
!HERO 
!Happy_Birthday_Guadaloupe! 
!Happy_Birthday_Guadalupe! 
!Hello_Friends 

我已經在網上搜索,但不能su cceed。任何幫助將不勝感激。

+0

嘗試're。sub(「[^ a-zA-Z]」,「」,text)'而不是 – imant

+0

@imant我也試過這個,但是我得到了下面的錯誤:** TypeError:不能在字節類對象上使用字符串模式* * – Sherlock

回答

3

您必須選擇二進制和文本模式。

要麼你打開你的文件作爲rb,然後你可以使用re.sub(b"[^a-zA-Z]", b" ", text)textbytes對象)

或者你打開你的文件作爲r,然後你可以使用re.sub("[^a-zA-Z]", " ", text)textstr對象)

第二種解決方案更「經典」。

5

問題是與您提供的repl參數,它是不是一個bytes對象:

letters_only = re.sub(b"[^a-zA-Z]", " ", b'Hello2World') 
# TypeError: sequence item 1: expected a bytes-like object, str found 

相反,供應repl作爲一個字節實例b" "

letters_only = re.sub(b"[^a-zA-Z]", b" ", b'Hello2World') 
print(letters_only) 
b'Hello World' 

注:不要在文字前加上b,如果你使用rb也不要打開文件不尋找byte序列。

+0

非常好,我不知道它可以在字節上完成。但我不確定這是去這裏的路。最好去純文本和丟棄字節。那麼,也許它可以避免編碼問題。 –

+0

的工作,現在沒有錯誤。但是我爲每個提取的單詞添加了「b」前綴。像這樣** [b'you',b'and',b'then',b'some'] **,但我認爲根據你不應該在那裏。 – Sherlock

+0

@ Jean-FrançoisFabre你是對的;-)。 Sherlock,只要在@Jean的回答中建議不要指定'b'即可打開文件。當打開文件導致它們被讀爲'bytes'對象時,'b'前綴爲模式,如果這不是你所需要的,請將它放下:-) –

2

如果替換字符串不是,則不能使用byte字符串作爲正則表達式匹配。
基本上,在做大部分任務時,不能混合不同的對象(byte s和string s)。在上面的代碼中,您使用的是二進制搜索字符串和二進制文本,但替換字符串是常規的string。所有參數需要是相同的類型,所以有兩種可能的解決方案。

考慮到上述情況,你的代碼看起來是這樣的(這將返回定期string字符串,而不是byte對象):

with open('/Users/some/directory/title.txt', 'r')as f: 
    text=f.read() 
    letters_only = re.sub(r"[^a-zA-Z]", " ", text) 
    words = letters_only.lower().split() 
print(words) 

注意,代碼不會使用一個特殊類型的字符串爲正則表達式 - 原始字符串,前綴爲r。這意味着python不會解釋轉義字符,如\,這對正則表達式非常有用。有關原始字符串的更多詳細信息,請參見the docs

+0

實際上你可以做到這一點,請參閱Jim的回答。你應該知道,我知道它至少...... 5分鐘:) –

+0

@ Jean-FrançoisFabre嗯mmmmm ...我現在也是;) – Dartmouth

相關問題