Краткий ответ, как @ THC4K указывает в комментарии:
string.split(pattern, 1)[0]
, где string
- исходная строка, pattern
- шаблон прерывания, 1
указывает на разделение не более 1 раза, а [0]
означает получение первого элемента, возвращенного split.
В действии:
>>> s = "a descriptor 23 fd"
>>> s.split("23", 1)[0]
'a descriptor '
>>> s.split("fdasfdsafdsa", 1)[0]
'a descriptor 23 fd'
Это гораздо более короткий способ выразить то, что я написал ранее, и я все равно буду здесь его хранить.
И если вам нужно удалить несколько шаблонов, это отличный кандидат для встроенного reduce
:
>>> 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'
Это в основном гласит: для каждого pat
в patterns
: возьмите string
и повторно примените string.split(pat, 1)[0]
(как объяснено выше), работая каждый раз с результатом ранее возвращенного значения. Как видите, если в строке нет ни одного из шаблонов, исходная строка все равно возвращается.
Самый простой ответ - фрагмент списка / строки в сочетании с 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'
Лучшим подходом (чтобы не обрезать последний символ в пропущенном шаблоне, когда s.find
возвращает -1) может быть обтекание простой функцией:
>>> 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'
Синтаксис [:s.find(x)]
означает перевод части строки из индекса 0 в правую часть двоеточия; и в этом случае RHS является результатом s.find
, который возвращает индекс строки, которую вы передали.