web-dev-qa-db-fra.com

Python: comment imprimer une chaîne assortie d'expressions rationnelles?

Je veux faire correspondre une partie de la chaîne (un mot particulier) et l'imprimer. Exactement ce que fait grep -o. Mon mot est "chien jaune" par exemple et il peut être trouvé dans une chaîne qui s'étend sur plusieurs lignes.

[34343] | ****. "Example": <one>, yellow dog
        tstring0 123
        tstring1 456
        tstring2 789

Essayons cette expression régulière mydog = re.compile(', .*\n') puis if mydog.search(string): imprime uniquement les mots correspondants.

Comment puis-je obtenir uniquement "chien jaune" dans la sortie?

15
minerals

Utilisation d'un groupe de capture et de findall:

>>> import re
>>> s = """[34343] | ****. "Example": <one>, yellow dog
...         tstring0 123
...         tstring1 456
...         tstring2 789"""
>>> mydog = re.compile(', (.*)\n')
>>> mydog.findall(s)
['yellow dog']

Si vous ne voulez que le premier match, alors:

>>> mydog.findall(s)[0]
'yellow dog'

Remarque: vous souhaitez gérer le IndexError lorsque s ne contient pas de correspondance.

18
Chris Seymour

Si vous ne spécifiez pas de groupe de capture, le texte correspondant à l'expression entière sera contenu avec matchResult.group(0). Dans votre cas, ce serait ', yellow dog\n'. Si vous voulez juste le yellow dow, Vous devez ajouter un groupe de capture à l'expression: , (.*?)\n. Notez que j'ai également changé le .* En un .*? Afin qu'il ne soit pas gourmand et s'arrête quand il trouve le premier saut de ligne.

>>> s = '''[34343] | ****. "Example": <one>, yellow dog
        tstring0 123
        tstring1 456
        tstring2 789'''
>>> mydog = re.compile(', (.*?)\n')
>>> matchResult = mydog.search(s)
>>> if matchResult:
        print(matchResult.group(1))

yellow dog
5
poke