正如@THC4K 在评论中指出的那样,简短的回答:
string.split(pattern, 1)[0]
其中string 是您的原始字符串,pattern 是您的“中断”模式,1 表示拆分不超过 1 次,[0] 表示获取拆分返回的第一个元素。
在行动:
>>> 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'
这基本上是说:对于patterns中的每个pat:取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 的结果,它返回您传递的字符串的索引。