web-dev-qa-db-fra.com

Comment puis-je retourner une chaîne d'une correspondance regex en python?

Je traverse des lignes dans un fichier texte en utilisant un script python. Je souhaite rechercher une balise img dans le document texte et la renvoyer sous forme de texte.

Quand je lance la regex re.match(line), il retourne un _sre.SRE_MATCH objet. Comment puis-je le faire renvoyer une chaîne?

import sys
import string
import re

f = open("sample.txt", 'r' )
l = open('writetest.txt', 'w')

count = 1

for line in f:
    line = line.rstrip()
    imgtag  = re.match(r'<img.*?>',line)
    print("yo it's a {}".format(imgtag))

Lorsqu'il est exécuté, il imprime:

yo it's a None
yo it's a None
yo it's a None
yo it's a <_sre.SRE_Match object at 0x7fd4ea90e578>
yo it's a None
yo it's a <_sre.SRE_Match object at 0x7fd4ea90e578>
yo it's a None
yo it's a <_sre.SRE_Match object at 0x7fd4ea90e578>
yo it's a <_sre.SRE_Match object at 0x7fd4ea90e5e0>
yo it's a None
yo it's a None
49
Jack Dalton

Vous devriez utiliser re.MatchObject.group(0). Comme

imtag = re.match(r'<img.*?>', line).group(0)

Modifier:

Vous feriez peut-être mieux de faire quelque chose comme

imgtag  = re.match(r'<img.*?>',line)
if imtag:
    print("yo it's a {}".format(imgtag.group(0)))

éliminer tous les Nones.

69
wflynny

Étant donné qu'il pourrait y avoir plusieurs balises img, je recommanderais re.findall:

import re

with open("sample.txt", 'r') as f_in, open('writetest.txt', 'w') as f_out:
    for line in f_in:
        for img in re.findall('<img[^>]+>', line):
            print >> f_out, "yo it's a {}".format(img)
6
newtover

imgtag.group(0) ou imgtag.group(). Cela renvoie la correspondance entière sous forme de chaîne. Vous ne capturez rien d'autre non plus.

http://docs.python.org/release/2.5.2/lib/match-objects.html

4
Explosion Pills

Notez que re.match(pattern, string, flags=0) ne renvoie que les correspondances au début de la chaîne. Si vous voulez localiser une correspondance n'importe où dans la chaîne, utilisez plutôt re.search(pattern, string, flags=0) (- https://docs.python.org/3/library/re.html ). Cela va scanner la chaîne et retourner le premier objet de correspondance. Ensuite, vous pouvez extraire la chaîne correspondante avec match_object.group(0) comme suggéré par les gens.

3
Sergii Shcherbak