TypeError:序列项1:期望找到类似字节的对象,str

She*_*ock 6 python regex python-3.x

我试图从使用Python 3中的正则表达式的文本文件中的wiki标题转储中提取英文标题.Wiki转储包含其他语言的标题和一些符号.以下是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

TypeError: sequence item 1: expected a bytes-like object, str found 
Run Code Online (Sandbox Code Playgroud)

在线: 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
Run Code Online (Sandbox Code Playgroud)

我在线搜索但无法成功.任何帮助将不胜感激.

Jim*_*ard 6

问题在于repl你提供的参数,它不是一个bytes对象:

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

相反,提供repl为字节实例b" ":

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

注意:如果您没有查找序列,请不要在文字前加上b,也不要打开文件.rbbyte

  • 让我说我很高兴事情的结果:Jim是我们所有人中最了解的人,他知道使用正则表达式来处理`bytes`的能力,虽然我们,凡人,只想使用文本文件并知道拉链!所以每个人都学到了一些东西而没有人受到抨击(我几乎在某些时候删除了我的帖子) (2认同)

Jea*_*bre 4

您必须在二进制模式和文本模式之间进行选择。

要么你打开你的文件rb然后你可以使用re.sub(b"[^a-zA-Z]", b" ", text)text是一个bytes对象)

或者您打开文件,r然后您可以使用re.sub("[^a-zA-Z]", " ", text)text是一个str对象)

第二种解决方案更加“经典”。