Python 2.7.1 Próbuję użyć wyrażenia regularnego w języku Python, aby wyodrębnić słowa wewnątrz wzorca
Mam taki sznurek
someline abc
someother line
name my_user_name is valid
some more lines
Chcę wyodrębnić słowo „my_user_name”. Robię coś takiego
import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s) #this gives me <_sre.SRE_Match object at 0x026B6838>
Jak mogę teraz wyodrębnić my_user_name?
group(0)
na pierwszy mecz?group(0)
zwraca dopasowany tekst, a nie pierwszą grupę przechwytywania. Komentarz do kodu jest poprawny, chociaż wydaje się, że dezorientujesz grupy przechwytywania i dopasowania.group(1)
zwraca pierwszą grupę przechwytywania.NameError: name '_' is not defined
_ = p.search(s)
. Widzę, że wspomina o ustawieniu wyniku na,_
ale kod tego nie odzwierciedla. Zmieniłem_ = p.search(s)
na drugą linię i działa._
. Nie obowiązuje na zewnątrz nigdzie indziej.Możesz użyć pasujących grup:
na przykład
Tutaj używam
re.findall
zamiastre.search
pobierania wszystkich wystąpieńmy_user_name
. Używającre.search
, musisz pobrać dane z grupy w obiekcie dopasowania:Jak wspomniano w komentarzach, możesz chcieć, aby Twoje wyrażenie regularne nie było chciwe:
aby podnieść tylko rzeczy pomiędzy
'name '
a następną' is valid'
(zamiast pozwalać twojemu wyrażeniu regularnemu na wybieranie innych' is valid'
w twojej grupie.źródło
(.*?)
? Tak, to możliwe, chociaż nie jest to konieczne, chyba że używamy OPre.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
prawdopodobnie nie przyniesie pożądanych rezultatów ....group
jest dokładnie taka sama, jak odpowiedź, którą zaakceptowałeś ...Możesz użyć czegoś takiego:
źródło
Może to trochę krótsze i łatwiejsze do zrozumienia:
źródło
Chcesz grupę przechwytywania .
źródło
Możesz użyć grup (oznaczonych
'('
i')'
) do przechwytywania części ciągu. Metoda obiektu matchgroup()
podaje następnie zawartość grupy:W Pythonie 3.6+ możesz także indeksować do obiektu dopasowania zamiast używać
group()
:źródło
Oto sposób na zrobienie tego bez używania grup (Python 3.6 lub nowszy):
źródło
Możesz także użyć grupy przechwytywania
(?P<user>pattern)
i uzyskać dostęp do grupy jak do słownikamatch['user']
.źródło
Wygląda na to, że tak naprawdę próbujesz wydobyć imię imadło, po prostu znajdź dopasowanie. W takim przypadku posiadanie indeksów zakresu dla dopasowania jest pomocne i polecam użycie
re.finditer
. Jako skrót wiesz, żename
część twojego wyrażenia regularnego ma długość 5, ais valid
długość 9, więc możesz wyciąć pasujący tekst, aby wyodrębnić nazwę.Uwaga - w Twoim przykładzie wygląda to tak, jakby
s
to był ciąg znaków ze znakami końca linii, więc tak właśnie przyjęto poniżej.źródło