Comment puis-je extraire tous les mots d'une chaîne qui commencent par le signe $? Par exemple dans la chaîne Je veux extraire les mots i essayé avec cette regex $ string code> et
$ Exemple code>. P>
\ b [$] \ s * code> mais cela fonctionne bien que si j'utilise un caractère normal plutôt que dollar. P> P>
4 Réponses :
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>
@ THG435: Tout à fait à droite, découvert cela aussi :-p le corrigé pour aborder le problème réel i>.
Il suffit d'ajouter une parenthèse (?: ^ | \ S) (\ $ \ w +) code> 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.
>>> [word for word in mystring.split() if word.startswith('$')] ['$string', '$example']
Utilisez Word.Startswith ('$') code>. 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.
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']
Ça va correspondre $$ mots code> 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 i> lookbehind: (? .
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: si vous pourriez avoir un "mot" au début d'une ligne : p>
Cela correspond à Word $ avec $ $ $ $ Dollars CODE>.
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. :-)
\ w code> est meilleur que
\ s code> 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 code>
, car il est déjà implémenté pour vous et prend déjà en charge exactement cette syntaxe.