Mam prosty kod w Pythonie, który wyszukuje w plikach ciąg np. path=c:\path
Gdzie c:\path
część może się różnić. Obecny kod to:
def find_path(i_file):
lines = open(i_file).readlines()
for line in lines:
if line.startswith("Path="):
return # what to do here in order to get line content after "Path=" ?
Jaki jest prosty sposób na uzyskanie tekstu Path=
?
Odpowiedzi:
Począwszy od
Python 3.9
możesz użyćremoveprefix
:źródło
Jeśli ciąg jest naprawiony, możesz po prostu użyć:
co daje ci wszystko od pozycji 5 w ciągu (łańcuch jest również sekwencją, więc te operatory sekwencji również działają tutaj).
Lub możesz podzielić linię na początku
=
:Wtedy parametr to „Path”, a wartość to reszta po pierwszym =.
źródło
split
zgłasza wyjątek, jeśli nie ma separatora.partition
jest bardziej stabilny, dzieli również ciąg i zawsze zwraca trzyelementową krotkę z pre-, separatorem i post-treścią (niektóre z nich mogą być,''
jeśli separator nie był obecny). Npvalue = line.partition('=')
.Usuń prefiks z ciągu
Podziel przy pierwszym wystąpieniu separatora przez
str.partition()
Przeanalizuj plik podobny do INI za pomocą ConfigParser
Inne opcje
str.split()
re.match()
źródło
źródło
Ogólnie rzecz biorąc, do cięcia (warunkowego lub bezwarunkowego) wolę to, co ostatnio zaproponował kolega; Użyj zamiany z pustym ciągiem. Łatwiejszy do odczytania kod, mniej kodu (czasami) i mniejsze ryzyko podania niewłaściwej liczby znaków. Dobrze; Nie używam Pythona, ale w innych językach wolę takie podejście:
lub - aby przejść do pierwszego komentarza do tego posta - jeśli należy to zrobić tylko wtedy, gdy wiersz zaczyna się od
Path
:Główną różnicą w stosunku do niektórych z tego, co zostało zasugerowane powyżej, jest to, że nie ma tu „magicznej liczby” (5) ani nie ma potrzeby określania zarówno „
5
”, jak i ciągu „Path=
”. Innymi słowy, wolę to podejście od konserwacji kodu punkt widzenia.źródło
rightmost = re.sub('^Path=', '', fullPath)
. Celem tejcompile()
metody jest przyspieszenie działania, jeśli ponownie użyjesz skompilowanego obiektu, ale ponieważ wyrzucasz go po użyciu, i tak nie ma to żadnego efektu. Zwykle i tak nie warto martwić się o tę optymalizację.Wolę
pop
indeksować[-1]
:do
źródło
startswith
zostało już przetestowane, więcsplit
podzieli „nic” przed i wszystko inne po.split("Path=", 1)
jest bardziej precyzyjny (w przypadku ponownego pojawienia się przedrostka w dalszej części ciągu), ale ponownie wprowadza magiczną liczbę.Albo dlaczego nie
źródło
Co powiesz na..
Ta trójka to głowa, separator i ogon .
źródło
Najprościej przychodzi mi do głowy krojenie:
Krótka uwaga na temat notacji wycinków, używa dwóch indeksów zamiast zwykłego. Pierwszy indeks wskazuje pierwszy element sekwencji, który chcesz umieścić w wycinku, a ostatni indeks to indeks występujący bezpośrednio po ostatnim elemencie, który chcesz umieścić w wycinku.
Na przykład:
Kawałek składa się ze wszystkich elementów między
first_index
alast_index
, w tymfirst_index
i nielast_index
. Jeśli pierwszy indeks zostanie pominięty, domyślnie jest to początek sekwencji. Jeśli ostatni indeks zostanie pominięty, obejmuje wszystkie elementy aż do ostatniego elementu w sekwencji. Dozwolone są również indeksy ujemne. Skorzystaj z Google, aby dowiedzieć się więcej na ten temat.źródło
źródło
r''
ciągów znaków dla ścieżek Windows. 2.re.match()
może zwrócić BrakKolejna prosta jedna linijka, o której tutaj nie wspomniano:
Będzie to również działać poprawnie w różnych przypadkach skrajnych:
źródło
daje znaki po pierwszych pięciu.
źródło
line[5:]
da żądany podciąg. Przeszukaj wprowadzenie i poszukaj „notacji plasterków”źródło
Jeśli znasz listy składane:
źródło
line.startswith(...)
jest 10X szybsza. Moje testy tego nie potwierdziły. Chętnie to zmienię, jeśli zostaną przedstawione dowody potwierdzające to stwierdzenie.Wersja pop nie była całkiem poprawna. Myślę, że chcesz:
źródło
Dlaczego nie użyć wyrażenia regularnego z funkcją ucieczki?
^
dopasowuje początkową część wiersza ire.MULTILINE
dopasowuje w każdym wierszu.re.escape
zapewnia dokładne dopasowanie.źródło
Spróbuj poniższego kodu
źródło
Myślę, że właśnie tego szukasz
źródło
bez konieczności pisania funkcji, to podzieli się zgodnie z listą, w tym przypadku „Mr. W poniższym przypadku zwracany jest tekst „Morris”.
źródło
Jest to bardzo podobne pod względem techniki do innych odpowiedzi, ale bez powtarzających się operacji na łańcuchach, możliwość stwierdzenia, czy prefiks był, czy nie, i nadal całkiem czytelny:
źródło