2013-08-28 15 views
31

Używam wierszy w pliku tekstowym przy użyciu skryptu python. Chcę wyszukać znacznik img w dokumencie tekstowym i zwrócić tag jako tekst.Jak mogę zwrócić ciąg z dopasowania regex w python?

Po uruchomieniu regex re.match(line) zwraca obiekt _sre.SRE_MATCH. Jak mogę uzyskać ciąg znaków?

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)) 

Po uruchomieniu drukuje:

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 

Odpowiedz

40

Należy użyć re.MatchObject.group(0). Jak

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

Edit:

też może być lepiej robić coś jak

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

aby wyeliminować wszystkie None s.

+0

Zobacz http://docs.python.org/2/library/re.html#match-objects – stalepretzel

6

Biorąc pod uwagę, że może być kilka img tagi Polecam 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) 
1

Zauważ, że re.match(pattern, string, flags=0) zwraca tylko mecze w zaczynają napisu. Jeśli chcesz znaleźć dopasowanie w dowolnym miejscu w ciągu, użyj zamiast niego re.search(pattern, string, flags=0) (https://docs.python.org/3/library/re.html). Spowoduje to zeskanowanie ciągu znaków i zwrócenie pierwszego obiektu dopasowania. Następnie możesz wyodrębnić pasujący ciąg znaków za pomocą match_object.group(0), zgodnie z sugestią innych osób.

Powiązane problemy