2016-12-03 5 views
2

Für meine Programmierung Klasse, muss ich nach der folgenden Beschreibung eine Funktion erstellen:Python - Extrahieren Hashtags aus Text; Ende an Interpunktion

Der Parameter ein Tweet ist. Diese Funktion sollte eine Liste mit allen Hashtags im Tweet zurückgeben, in der Reihenfolge, in der sie im Tweet erscheinen. Bei jedem Hashtag in der zurückgegebenen Liste sollte das ursprüngliche Hash-Symbol entfernt sein und Hashtags sollten eindeutig sein. (Wenn ein tweet den gleichen Hashtag zweimal verwendet, wird es in der Liste enthält nur ein einziges Mal. Die Reihenfolge der Hashtags sollte die Reihenfolge des ersten Auftretens eines jeden Tages in den Tweet Übereinstimmen.)

Ich bin nicht sicher, wie um es so zu machen, dass der Hashtag endet, wenn Interpunktion auftritt (siehe zweites Doctest-Beispiel). Mein aktueller Code gibt nichts aus:

def extract(start, tweet): 
    """ (str, str) -> list of str 

    Return a list of strings containing all words that start with a specified character. 

    >>> extract('@', "Make America Great Again, vote @RealDonaldTrump") 
    ['RealDonaldTrump'] 
    >>> extract('#', "Vote Hillary! #ImWithHer #TrumpsNotMyPresident") 
    ['ImWithHer', 'TrumpsNotMyPresident'] 
    """ 

    words = tweet.split() 
    return [word[1:] for word in words if word[0] == start] 

def strip_punctuation(s): 
    """ (str) -> str 

    Return a string, stripped of its punctuation. 

    >>> strip_punctuation("Trump's in the lead... damn!") 
    'Trumps in the lead damn' 
    """ 
    return ''.join(c for c in s if c not in '!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~') 

def extract_hashtags(tweet): 
    """ (str) -> list of str 

    Return a list of strings containing all unique hashtags in a tweet. 
    Outputted in order of appearance. 

    >>> extract_hashtags("I stand with Trump! #MakeAmericaGreatAgain #MAGA #TrumpTrain") 
    ['MakeAmericaGreatAgain', 'MAGA', 'TrumpTrain'] 
    >>> extract_hashtags('NEVER TRUMP. I'm with HER. Does #this! work?') 
    ['this'] 
    """ 

    hashtags = extract('#', tweet) 

    no_duplicates = [] 

    for item in hashtags: 
     if item not in no_duplicates and item.isalnum(): 
      no_duplicates.append(item) 

    result = [] 
    for hash in no_duplicates: 
     for char in hash: 
      if char.isalnum() == False and char != '#': 
       hash == hash[:char.index()] 
       result.append() 
    return result 

Ich bin ziemlich verloren an diesem Punkt; jede Hilfe würde geschätzt werden. Vielen Dank im Voraus.

Hinweis: Wir sind nicht erlaubt, reguläre Ausdrücke zu verwenden oder irgendwelche Module zu importieren.

+1

Nun .. Wenn Sie mit Interpunktion enden müssen, und es gibt nicht diese vielen Punktuationssymbole, warum nicht überprüfen, ob das nächste Zeichen ein Interpunktionszeichen ist? – Pythonista

Antwort

0

Sie sehen ein wenig verloren aus. Der Schlüssel zur Lösung dieser Art von Problemen besteht darin, das Problem in kleinere Teile aufzuteilen, diese zu lösen und dann die Ergebnisse zu kombinieren. Sie haben jedes Stück, was Sie brauchen ..:

def extract_hashtags(tweet): 
    # strip the punctuation on the tags you've extracted (directly) 
    hashtags = [strip_punctuation(tag) for tag in extract('#', tweet)] 
    # hashtags is now a list of hash-tags without any punctuation, but possibly with duplicates 

    result = [] 
    for tag in hashtags: 
     if tag not in result: # check that we haven't seen the tag already (we know it doesn't contain punctuation at this point) 
      result.append(tag) 
    return result 

ps: Das ist ein Problem, das für eine regex Lösung gut geeignet ist, aber wenn man ein schnelles strip_punctuation wollen könnten Sie:

def strip_punctuation(s): 
    return s.translate(None, '!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~')