【问题标题】:re.sub erroring with "Expected string or bytes-like object"re.sub 出现“预期的字符串或类似字节的对象”错误
【发布时间】:2017-09-29 08:51:21
【问题描述】:

我已经阅读了多篇关于此错误的帖子,但我仍然无法弄清楚。当我尝试遍历我的函数时:

def fix_Plan(location):
    letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          location)     # Column and row to search    

    words = letters_only.lower().split()     
    stops = set(stopwords.words("english"))      
    meaningful_words = [w for w in words if not w in stops]      
    return (" ".join(meaningful_words))    

col_Plan = fix_Plan(train["Plan"][0])    
num_responses = train["Plan"].size    
clean_Plan_responses = []

for i in range(0,num_responses):
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))

这是错误:

Traceback (most recent call last):
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 48, in <module>
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 22, in fix_Plan
    location)  # Column and row to search
  File "C:\Users\xxxxx\AppData\Local\Programs\Python\Python36\lib\re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

【问题讨论】:

  • 如果您遇到错误,始终发布包括堆栈跟踪在内的完整错误
  • print(train["Plan"][i]) 看看它是什么。在 for 循环中调用 fix_Plan() 之前执行此操作。我不认为train["Plan"][i] 是你所期望的。
  • 你可以添加尝试吗:除了在 fix_Plan 中,如果位置:
  • 它是来自 excel 文档的字符串,格式如下: 视频编辑:使用 Wochit、Videolicious 和 iMovie 等工具进一步培养视频制作技能。制定一项针对体育运动的生产计划,将努力与潜在观众/影响相匹配。扩展 HTML/CSS 技能并确定一到两个体育项目,这些项目可以从 HTML 故事中受益,然后实施。
  • 确定它是一个字符串吗?尝试打印type(train['Plan'][i])

标签: python regex pandas nltk


【解决方案1】:

正如您在 cmets 中所述,某些值似乎是浮点数,而不是字符串。在将其传递给re.sub 之前,您需要将其更改为字符串。最简单的方法是在使用re.sub 时将location 更改为str(location)。即使它已经是str,无论如何这样做也没有什么坏处。

letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          str(location))

【讨论】:

  • 我在 Jupyter 中写了两本笔记本,在 Kaggle Kernels 中写了一本。 Jupyter one 工作正常并产生正确的输出。 Kaggle Notebook 给了我一个错误,我遵循了您的解决方案,错误已被删除,但现在情绪预测结果错误。
【解决方案2】:

最简单的解决方案是将 Python str 函数应用于您尝试循环遍历的列。

如果你使用pandas,可以这样实现:

dataframe['column_name']=dataframe['column_name'].apply(str)

【讨论】:

  • 我建议用 '' dataframe['column_name'] = dataframe['column_name'].fillna('').apply(str) 填充 nan 值,因为在大多数用例中,人们不希望 nan 是字面意义上的 'nan'
【解决方案3】:

我遇到了同样的问题。而且很有意思的是,每次我做某事,直到我意识到字符串中有两个特殊字符,问题才解决。

例如,对我来说,文本有两个字符:

&amp;lrm; (Left-to-Right Mark)&amp;zwnj; (Zero-width non-joiner)

我的解决方法是删除这两个字符,问题就解决了。

import re
mystring = "&lrm;Some Time W&zwnj;e"
mystring  = re.sub(r"&lrm;", "", mystring)
mystring  = re.sub(r"&zwnj;", "", mystring)

我希望这对像我这样有问题的人有所帮助。

【讨论】:

    【解决方案4】:

    我想最好使用 re.match() 函数。这是一个可以帮助你的例子。

    import re
    import nltk
    from nltk.tokenize import word_tokenize
    nltk.download('punkt')
    sentences = word_tokenize("I love to learn NLP \n 'a :(")
    #for i in range(len(sentences)):
    sentences = [word.lower() for word in sentences if re.match('^[a-zA-Z]+', word)]  
    sentences
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2020-11-19
      • 2020-08-24
      • 2019-12-13
      相关资源
      最近更新 更多