11
votes

Un moyen élégant de faire sortir des hashtags d'une ficelle en python?

Je cherche un moyen propre pour obtenir un ensemble (liste, matry, quoi que ce soit) des mots commençant par # code> à l'intérieur d'une chaîne donnée.

in c #, j'écrirais P>

var hashtags = input
    .Split (' ')
    .Where (s => s[0] == '#')
    .Select (s => s.Substring (1))
    .Distinct ();


2 commentaires

Maintenant que vous avez ajouté .Distit () - il doit-il être le même ordre que dans l'entrée ou peut-être être un ensemble non ordonné? Ce dernier est un moyen beaucoup plus facile et plus rapide de filtrer des doublons.


@delnan: L'ensemble non ordonné est bien.


6 Réponses :


8
votes

Je dirais

set(hashtags)


1 commentaires

Tu m'as battu à 8 secondes



15
votes
set([i[1:] for i in line.split() if i.startswith("#")])

3 commentaires

+1 pour .startswith. Ici, cela n'a pas d'importance, mais il gère le cas des chaînes vides et se généralise bien à n'importe quelle longueur, et donc une bonne habitude d'entrer dans.


@gaearon: somestr.split () ne sera-t-il pas, il bande tout espacement supplémentaire. 'a'.split (' a ') sera.


@GAEARON: Cela peut renvoyer une liste vide si la chaîne est vide ou ne contient que des espaces blanche. Les chaînes de cette liste ne seront pas vides si .split () est appelé, mais peut être indiqué si un sépérateur explicite est donné et la chaîne contient deux de ceux sans rien d'autre entre les deux. Voir The Docs .



1
votes

Une autre option est regex: xxx


1 commentaires

Bien, mais je voulais quelque chose de plus facilement lisible que les regextes.



10
votes

La méthode (code> de Objets d'expression réguliers peut tous les obtenir à la fois: xxx


0 commentaires

24
votes

avec @ Inspectorg4dget's Réponse , si vous ne voulez pas de duplicates, vous pouvez utiliser définies de compréhensions au lieu de compréhensions de la liste. xxx

Notez que {} Syntaxe pour les compréhensions définies travaille seulement à partir de Python 2.7.
Si vous travaillez avec des versions plus anciennes, la compréhension de la liste d'aliments ( [] ) sur définit fonction comme suggéré par @bertrand .


5 commentaires

Exactement ce dont j'avais besoin. Merci.


Il y a une faute de frappe en mon nom: c'est inspectorg4dget. Vous avez un '5' au lieu d'un '4'


@ inspectorg4dget, désolé, n'a pas remarqué. Et j'ai appris que je devrais le lier.


Une chose à ajouter à cela, si quelqu'un travaille avec Instagram, etc. Les balises sont contenues dans une légende et n'ont pas nécessairement besoin d'espaces entre eux. IE la légende # # washington westcoasts # Floride évaluerait [ 'washington # westcoasts # florida'] --------------- ------------------------------------------- Mon contournement: {tag.strip ("#" ) Pour la balise dans tags.replace ('#', '#'). Split () si tag.startswith ("#")}


@duality: Merci, tandis que votre solution ne fonctionne pas directement, il y a une petite solution - alors ça marche {tag.strip ("#") pour la balise dans tags.replace (# '#'). Split () si tag.startswith ("#")}



0
votes

Il y a quelques problèmes avec les réponses présentées ici.

  1. {tag.strip ("#") pour tag in tags.split () si tag.startswith ("#")} p>

    [i [1:] pour i in line.split () si j'établie ("#")] p> li> ol>

    ne fonctionne pas si vous avez HASHTAG comme '# one # deux #' p>

    2 re.comple (r "# (\ w +)") code> Travailler pour de nombreuses langues Unicode (même à l'aide de Re.unicode) P>

    J'avais vu plus de moyens d'extraire hashtag, mais j'ai trouvé non d'entre eux répondant sur tous les cas p>

    Alors j'ai écrit un petit python code pour gérer la plupart des cas. Cela fonctionne pour moi. P>

    def get_hashtagslist(string):
        ret = []
        s=''
        hashtag = False
        for char in string:
            if char=='#':
                hashtag = True
                if s:
                    ret.append(s)
                    s=''           
                continue
    
            # take only the prefix of the hastag in case contain one of this chars (like on:  '#happy,but i..' it will takes only 'happy'  )
            if hashtag and char in [' ','.',',','(',')',':','{','}'] and s:
                ret.append(s)
                s=''
                hashtag=False 
    
            if hashtag:
                s+=char
    
        if s:
            ret.append(s)
    
        return set(ret)
    


0 commentaires