Krótka odpowiedź, jak @ THC4K zwraca uwagę w komentarzu:
string.split(pattern, 1)[0]
gdzie string
jest oryginalny łańcuch, pattern
jest Twój „break” wzór, 1
wskazuje podzielić nie więcej niż 1 godzinę, a [0]
oznacza pierwszy element zwracany przez dzielenie.
w akcji:
>>> s = "a descriptor 23 fd"
>>> s.split("23", 1)[0]
'a descriptor '
>>> s.split("fdasfdsafdsa", 1)[0]
'a descriptor 23 fd'
ten jest znacznie krótszy sposób wyrażania tego, co napisałem wcześniej, które będę tutaj tak.
A jeśli trzeba usunąć wiele wzorów, jest to świetny kandydat na reduce
wbudowanego polecenia:
>>> string = "a descriptor dps foo 23 bar fd quux"
>>> patterns = ["dps", "23", "fd"]
>>> reduce(lambda s, pat: s.split(pat, 1)[0], patterns, string)
'a descriptor '
>>> reduce(lambda s, pat: s.split(pat, 1)[0], patterns, "uiopuiopuiopuipouiop")
'uiopuiopuiopuipouiop'
To w zasadzie mówi: dla każdego pat
w patterns
: wziąć string
i wielokrotnie zastosować string.split(pat, 1)[0]
(jak wyjaśniono powyżej), operując na wynikach poprzednio zwróconej wartości za każdym razem. Jak widać, jeśli żaden z wzorów nie znajduje się w łańcuchu, pierwotny ciąg jest nadal zwracany.
Najprostsza odpowiedź jest kawałek lista/string połączeniu z string.find
:
>>> s = "a descriptor 23 fd"
>>> s[:s.find("fd")]
'a descriptor 23 '
>>> s[:s.find("23")]
'a descriptor '
>>> s[:s.find("gggfdf")] # <-- look out! last character got cut off
'a descriptor 23 f'
Lepszym rozwiązaniem (aby uniknąć odcinając ostatni znak w brakującej wzór kiedy s.find
zwraca -1) może być zawijany w prostej zależności:
>>> def cutoff(string, pattern):
... idx = string.find(pattern)
... return string[:idx if idx != -1 else len(string)]
...
>>> cutoff(s, "23")
'a descriptor '
>>> cutoff(s, "asdfdsafdsa")
'a descriptor 23 fd'
Składnia [:s.find(x)]
oznacza się część łańcucha z indeksem 0 do prawej godz i bok jelita; i w tym przypadku RHS jest wynikiem s.find
, który zwraca indeks ciągu, który przekazałeś.
W swoich przykładach, jakie są kody, a co powinno wyglądać wyjście? –