Chcę uzyskać pierwsze dopasowanie wyrażenia regularnego.
W tym przypadku mam listę:
text = 'aa33bbb44'
re.findall('\d+',text)
[„33”, „44”]
Mógłbym wyodrębnić pierwszy element listy:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
„33”
Ale to działa tylko wtedy, gdy jest co najmniej jedno dopasowanie, w przeciwnym razie otrzymam błąd:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
IndexError: indeks listy poza zakresem
W takim przypadku mógłbym zdefiniować funkcję:
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
Czy istnieje sposób uzyskania tego wyniku bez definiowania nowej funkcji?
len(re.findAll)==0
zamiast tego użyć sprawdzenia.Odpowiedzi:
Możesz osadzić
''
domyślne w swoim wyrażeniu regularnym, dodając|$
:>>> re.findall('\d+|$', 'aa33bbb44')[0] '33' >>> re.findall('\d+|$', 'aazzzbbb')[0] '' >>> re.findall('\d+|$', '')[0] ''
Działa również ze
re.search
wskazanymi przez innych:>>> re.search('\d+|$', 'aa33bbb44').group() '33' >>> re.search('\d+|$', 'aazzzbbb').group() '' >>> re.search('\d+|$', '').group() ''
źródło
findall
użyty?” .Jeśli potrzebujesz tylko pierwszego dopasowania, użyj
re.search
zamiastre.findall
:>>> m = re.search('\d+', 'aa33bbb44') >>> m.group() '33' >>> m = re.search('\d+', 'aazzzbbb') >>> m.group() Traceback (most recent call last): File "<pyshell#281>", line 1, in <module> m.group() AttributeError: 'NoneType' object has no attribute 'group'
Następnie możesz użyć
m
jako warunku sprawdzającego jako:>>> m = re.search('\d+', 'aa33bbb44') >>> if m: print('First number found = {}'.format(m.group())) else: print('Not Found') First number found = 33
źródło
Poszedłbym z:
r = re.search("\d+", ch) result = return r.group(0) if r else ""
re.search
i tak szuka tylko pierwszego dopasowania w ciągu, więc myślę, że dzięki temu twój zamiar jest nieco bardziej jasny niż użyciefindall
.źródło
W ogóle nie powinieneś używać
.findall()
-.search()
tego chcesz. Znajduje najbardziej lewe dopasowanie, które jest tym, czego chcesz (lub zwraca,None
jeśli dopasowanie nie istnieje).m = re.search(pattern, text) result = m.group(0) if m else ""
To, czy chcesz to umieścić w funkcji, zależy od Ciebie. To niezwykłe chce powrócić pusty ciąg, jeśli nie zostanie znaleziony, dlatego nic takiego, który jest wbudowany w. Jest to niemożliwe, aby dostać mylić o tym, czy
.search()
na własnych znalezisk mecz (zwracaNone
jeśli nie, alboSRE_Match
przedmiot jeśli tak).źródło
Możesz to zrobić:
x = re.findall('\d+', text) result = x[0] if len(x) > 0 else ''
Zwróć uwagę, że Twoje pytanie nie jest dokładnie związane z wyrażeniem regularnym. Raczej, jak bezpiecznie znaleźć element z tablicy, jeśli go nie ma.
źródło
Może to działałoby trochę lepiej, gdyby większa ilość danych wejściowych nie zawierała poszukiwanego elementu, ponieważ ma większy koszt.
def return_first_match(text): result = re.findall('\d+',text) result = result[0] if result else "" return result
źródło