Powiedzmy, że mam ciąg znaków 'gfgfdAAA1234ZZZuijjk'
i chcę wyodrębnić tylko '1234'
część.
Wiem tylko, jakie będą te postacie bezpośrednio przed AAA
i po ZZZ
części, którą jestem zainteresowany 1234
.
Dzięki sed
temu można zrobić coś takiego za pomocą łańcucha:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
I to da mi 1234
w rezultacie.
Jak zrobić to samo w Pythonie?
Następnie możesz użyć wyrażeń regularnych z modułem re, jeśli chcesz, ale nie jest to konieczne w twoim przypadku.
źródło
re
metoda nie jest jednak szybsza?s
,s.find
zwróci-1
. operator krojenias[begin:end]
zaakceptuje go jako prawidłowy indeks i zwróci niepożądane podciąg.Wyrażenie regularne
Powyższe takie, jakie jest, zakończy się niepowodzeniem,
AttributeError
jeśli nie ma „AAA” i „ZZZ” wyour_text
metody strunowe
Powyższe zwróci pusty ciąg, jeśli „AAA” lub „ZZZ” nie istnieją
your_text
.Wyzwanie PS Python?
źródło
źródło
AttributeError: 'NoneType' object has no attribute 'groups'
- jeśli nie ma AAA, ZZZ w ciągu ...Zaskoczony, że nikt nie wspomniał o tym, co jest moją szybką wersją jednorazowych skryptów:
źródło
możesz to zrobić za pomocą tylko jednego wiersza kodu
wynik otrzyma listę ...
źródło
Możesz użyć do tego modułu re :
źródło
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
Możesz zrobić to samo z
re.sub
funkcją używając tego samego wyrażenia regularnego.W podstawowym sedu grupa przechwytująca jest reprezentowana przez
\(..\)
, ale w pythonie była reprezentowana przez(..)
.źródło
W Pythonie wyodrębnianie ciągu formularza podłańcuchowego można wykonać za pomocą
findall
metody wre
module wyrażenia regularnego ( ).źródło
źródło
źródło
Daje
źródło
Na wypadek, gdyby ktoś musiał zrobić to samo, co ja. Musiałem wyodrębnić wszystko z nawiasu w linii. Na przykład, jeśli mam takie zdanie, jak „prezydent USA (Barack Obama) spotkał się z ...” i chcę uzyskać tylko „Barack Obama”, oto rozwiązanie:
Tzn. Musisz zablokować nawias ze
slash \
znakiem. Chociaż problem dotyczy bardziej wyrażeń regularnych niż Python.Ponadto w niektórych przypadkach przed definicją wyrażenia regularnego możesz zobaczyć symbole „r”. Jeśli nie ma przedrostka r, musisz użyć znaków zmiany znaczenia jak w C. Oto więcej dyskusji na ten temat.
źródło
Korzystanie z PyParsing
co daje:
[['1234']]
źródło
Oto rozwiązanie bez wyrażenia regularnego, które uwzględnia również scenariusze, w których pierwszy podłańcuch zawiera drugi podłańcuch. Ta funkcja znajdzie podciąg tylko wtedy, gdy drugi znacznik znajduje się za pierwszym znacznikiem.
źródło
Innym sposobem na to jest użycie list (zakładając, że szukany podciąg składa się tylko z liczb):
źródło
Jeden wkładka, który zwraca inny ciąg, jeśli nie było dopasowania. Edycja: ulepszona wersja korzysta z
next
funkcji,"not-found"
w razie potrzeby zastąp ją inną:Moja inna metoda, aby to zrobić, mniej optymalna, używa wyrażenia regularnego 2. raz, wciąż nie znalazłem krótszej drogi:
źródło