9
votes

Python Regex: Faites correspondre une chaîne avec une seule instance d'un personnage

Supposons qu'il y ait deux cordes: xxx

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: xxx

.. 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 $.

Merci d'avance!

Méthode de test simple pour la vérification: < Pré> xxx


2 commentaires

Pourquoi ne pas utiliser le .Count () 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.


5 Réponses :


11
votes
>>> 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

3 commentaires

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 $ à l'intérieur d'une classe de caractères. r '^ [^ $] * \ $ [^ $] * $' fonctionne aussi bien.



1
votes
re.search("^[^$]*\$[^$]*$",test_string)

0 commentaires

1
votes
^.*?\$[^$]*$
this should make the trick

2 commentaires

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:



2
votes

Vous souhaitez utiliser le complément d'une classe [^] pour correspondre à n'importe quel caractère autre que $ : xxx < / Pré>

Les modifications de votre originale sont les suivantes:

  1. . * remplacé par [^ \ $] * . Le nouveau terme [^ \ $] signifie n'importe quel caractère autre que $
  2. $ ajouté à la chaîne. Oblige la correspondance à s'étendre jusqu'à la fin de la chaîne.
  3. re.search remplacé par re.match . Correspond à la chaîne entière plutôt que n'importe quel sous-ensemble.

1 commentaires

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>



8
votes
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1

1 commentaires

Je suis d'accord, une expression régulière serait surchargée ici.