re.sub fout met “Verwachte string of bytes-achtig object”

Ik heb meerdere berichten over deze fout gelezen, maar ik kom er nog steeds niet uit. Wanneer ik mijn functie probeer te doorlopen:

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]))

Dit is de fout:

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

Antwoord 1, autoriteit 100%

Zoals je in de opmerkingen hebt aangegeven, leken sommige waarden floats te zijn, geen strings. Je moet het veranderen in strings voordat je het doorgeeft aan re.sub. De eenvoudigste manier is om locationte wijzigen in str(location)bij gebruik van re.sub. Het zou toch geen kwaad kunnen om het toch te doen, zelfs als het al een stris.

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

Antwoord 2, autoriteit 11%

De eenvoudigste oplossing is om de functie Pythonstrtoe te passen op de kolom die u probeert door te lussen.

Als je pandasgebruikt, kan dit worden geïmplementeerd als:

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

Antwoord 3

Ik veronderstel dat het beter zou zijn om de functie re.match() te gebruiken. hier is een voorbeeld dat u kan helpen.

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

Antwoord 4

Ik had hetzelfde probleem. En het is heel interessant dat elke keer dat ik iets deed, het probleem niet werd opgelost totdat ik me realiseerde dat er twee speciale tekens in de tekenreeks zitten.

Voor mij heeft de tekst bijvoorbeeld twee tekens:

&lrm;(links- Rechts Mark ) en &zwnj;(Zero-breedte niet-joiner )

De oplossing voor mij was om deze twee tekens te verwijderen en het probleem is opgelost.


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

Ik hoop dat dit iemand heeft geholpen die een probleem is zoals ik.

Other episodes