12
votes

Trouvez tous les mots dans une chaîne qui commencent par la connexion $ en python

Comment puis-je extraire tous les mots d'une chaîne qui commencent par le signe $? Par exemple dans la chaîne xxx

Je veux extraire les mots $ string et $ Exemple .

i essayé avec cette regex \ b [$] \ s * mais cela fonctionne bien que si j'utilise un caractère normal plutôt que dollar.


2 commentaires

\ w est meilleur que \ s Si vous recherchez des mots (et ne voulez pas de communications / points / points-virgules / citations / ... incluse aussi).


Pourquoi voulez-vous extraire ces mots? Cela semble suspicieusement comme une sorte de langage de substitution à cordes, auquel cas vous devriez vraiment utiliser string.template , car il est déjà implémenté pour vous et prend déjà en charge exactement cette syntaxe.


4 Réponses :


6
votes

Le \ b code> évasion correspond aux limites des mots, mais le panneau $ n'est pas considéré comme faisant partie du mot que vous pouvez correspondre. Match sur le démarrage ou les espaces à la place:

>>> import re
>>> dollaredwords = re.compile(r'(?:^|\s)(\$\w+)')
>>> dollaredwords.search('Here is an $example for you!')
<_sre.SRE_Match object at 0x100882a80>


3 commentaires

@ THG435: Tout à fait à droite, découvert cela aussi :-p le corrigé pour aborder le problème réel .


Il suffit d'ajouter une parenthèse (?: ^ | \ S) (\ $ \ w +) et vous n'aurez plus l'espace ajouté au match. Acclamations!


@ Arewk: Yup; Mais je pense toujours que la solution non-regex est la meilleure ici.



23
votes
>>> [word for word in mystring.split() if word.startswith('$')]
['$string', '$example']

4 commentaires

Utilisez Word.Startswith ('$') . C'est plus lisible (et il gère des mots vides).


C'est en fait la meilleure solution jusqu'à présent.


@ user1515248 - Ouais, j'aime éviter le regex, quand du tout possible;)


OMG C'était tellement plus simple. Je cherchais des solutions pour extraire des URL, et ma chaîne n'est pas trop gâchée et que cela fonctionne pour cela. Maintenant, je dois rechercher ce qu'il faut faire à propos des marques de ponctuation à la fin et je suis défini.



9
votes

Le problème avec votre Expr est que \ b code> ne correspond pas entre un espace et un $ code>. Si vous le supprimez, tout fonctionne:

z = 'This $string is an $example and this$not'
import re
print re.findall(r'(?<=\W)[$]\S*', z) # ['$string', '$example']


3 commentaires

Ça va correspondre $$ mots aussi, n'est-ce pas?


@Martijn, oui, quelques problèmes avec celui-ci. Quoi qu'il en soit, la solution non-regex est meilleure dans ce cas.


Cela ne correspond pas au tout début de la chaîne. J'utiliserais un négatif lookbehind: (? .



2
votes

Plusieurs approches, en fonction de ce que vous voulez définir en tant que "mot" et si tous sont délimités par des espaces: xxx

si vous pourriez avoir un "mot" au début d'une ligne : xxx


4 commentaires

Cela correspond à Word $ avec $ $ $ $ Dollars .


Il ne correspond pas au premier mot dans une chaîne, par exemple. '$ premier d'autres mots'


@Martijnpieters: Je suis qualifié de "délimitée par des espaces" et j'ai ajouté un groupe de match qui gère les mots au début d'une ligne ...


Quel est le même que ma solution, avec le même problème: l'espace précédent fait maintenant partie de la chaîne correspondante. :-)