Supposons qu'il y ait deux cordes: en python, puis-je avoir une regex qui correspond quand il n'y a qu'un $ de la chaîne? C'est-à-dire que je veux que le RE soit correspondre à la première phrase, mais pas sur la seconde. J'ai essayé quelque chose comme: p> .. disant "match où vous voyez un $ suivi de quoi que ce soit, sauf pour un autre $". Il n'y avait pas de match sur l'exemple $$, mais il n'y avait pas non plus de match sur l'exemple de $. P> Merci d'avance! P> Méthode de test simple pour la vérification: p> < Pré> xxx pré> p>
5 Réponses :
>>> import re
>>> onedollar = re.compile(r'^[^\$]*\$[^\$]*$')
>>> onedollar.match('$1 off delicious ham.')
<_sre.SRE_Match object at 0x7fe253c9c4a8>
>>> onedollar.match('$1 off delicious $5 ham.')
>>>
Breakdown of regexp:
^ Anchor at start of string
[^\$]* Zero or more characters that are not $
\$ Match a dollar sign
[^\$]* Zero or more characters that are not $
$ Anchor at end of string
Points bonus pour le spectacle-N-dit. Avez-vous quelques minutes pour me décrire ce qui se passe, ici?
0 ou plus signe de numéros de dollars suivi d'un dollar suivi de 0 ou plus signe de dollar
Vous n'avez pas besoin d'échapper au $ code> à l'intérieur d'une classe de caractères. r '^ [^ $] * \ $ [^ $] * $' code> fonctionne aussi bien.
re.search("^[^$]*\$[^$]*$",test_string)
^.*?\$[^$]*$ this should make the trick
Bel usage d'un match non gourmand
Hmm .. N'ayez pas passé le test, cependant, à moins que des drapeaux spéciaux ont besoin de drapeaux spéciaux:
Vous souhaitez utiliser le complément em> d'une classe Les modifications de votre originale sont les suivantes: p> [^] code> pour correspondre à n'importe quel caractère autre que $ code>:
. * code> remplacé par [^ \ $] * code>. Le nouveau terme [^ \ $] code> signifie n'importe quel caractère autre que $ code> li>
$ code> ajouté à la chaîne. Oblige la correspondance à s'étendre jusqu'à la fin de la chaîne. Li>
re.search code> remplacé par re.match code>. Correspond à la chaîne entière plutôt que n'importe quel sous-ensemble. Li>
ol> p>
N'a pas passé! >>> Test (R »\ $ [0-9] + [^ \ €] * $") 1 $ de rabais 5 $ 5 $ de rabais 5 $ Delicious Ham <_sre.sre_match Objet à 0x00ed65D0> 1 $ de rabais sur tout délicieux jambon <_sre.sre_match At 0x00ed65D0>
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1
Je suis d'accord, une expression régulière serait surchargée ici.
Pourquoi ne pas utiliser le
.Count () code> méthode des cordes?Je suis sur la chaussure d'une nouvelle dans un outil qui ne me permet pas d'ajouter une logique supplémentaire. Donc, je ne peux pas faire "si comptez (str," $ ")> 1: passe". J'ai besoin de ne pas correspondre à une telle chaîne.