J'ai 3 cordes

a ="keep the your pass ABCDEFG other text"
b ="your pass: TESTVALUE other text"
c ="no pass required other text"

Je veux obtenir des valeurs en capital après le passage, comme ceci

re.match(r'.*\spass:?\s([a-zA-Z]+).*',a,re.I).group(1)
re.match(r'.*\spass:?\s([a-zA-Z]+).*',b,re.I).group(1)

Mais je veux exclure "pas de passe", c'est-à-dire que je ne veux pas faire correspondre à la chaîne c, comment faire?


Solution: Merci eyquem et ovgolovin

Je prendrai la suggestion d'eyquem de re.search ('no \ s + pass | pass:? \ S + ([A-Z] +)')

1
user976557 3 oct. 2011 à 15:27

3 réponses

Meilleure réponse
import re

for x in ("keep the your pass ABCDEFG other text",
          "your pass: TESTVALUE other text",
          "no pass required other text"):
    print re.search('no\s+pass|pass:?\s+([A-Z]+)',x).group(1)
A-Z]+)'

Résultat

ABCDEFG
TESTVALUE
None
3
eyquem 3 oct. 2011 à 12:26

Ce n'est pas OK d'utiliser match ici . Il est préférable d'utiliser search pour de tels cas.

re.search(r'(?<!no\s)pass:?\s+([A-Z]+)',a).group(1)

Il serait préférable de l'écrire de cette façon:

re.search(r'(?<!no\s*)pass:?\s+([A-Z]+)',a).group(1)

, mais malheureusement, la version actuelle du moteur regex ne prend pas en charge les lookbehinds infinis.

1
ovgolovin 3 oct. 2011 à 11:56

Une solution serait de filtrer tout ce qui ne contient pas de «passe», puis de rechercher passe. Faire deux étapes peut sembler un peu lourd, mais vous éviterez de nombreux problèmes en procédant de cette façon. Vous essayez de résoudre deux problèmes en même temps (et apparemment vous avez du mal à le faire) alors séparez simplement les deux problèmes.

1
mb14 3 oct. 2011 à 12:04
7634341