在某个短语后面切掉一个字符串?

2024-05-15 21:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一批绳子要剪断。它们基本上是一个描述符,后面跟着代码。我只想保留描述符。

'a descriptor dps 23 fd'
'another 23 fd'
'and another fd'
'and one without a code'

上面的代码是dps23fd。它们可以按任何顺序出现,彼此不相关,可能根本不存在(就像上一个例子一样)。

代码列表是固定的(或者至少可以预测),因此假设一个代码从未在合法的描述符中使用过,我如何在代码的第一个实例之后去掉所有内容。

我在用Python。


Tags: and代码列表顺序anothercodeone描述符
3条回答
codes = ('12', 'dps', '23')

def get_descriptor(text):
    words = text.split()
    for c in codes:
        if c in words:
            i = words.index(c)
            return " ".join(words[:i])
    raise ValueError("No code found in `%s'" % (text))

你好像在描述这样的事情:

def get_descriptor(text):
    codes = ('12', 'dps', '23')
    for c in codes:
        try:
            return text[:text.index(c)].rstrip()
        except ValueError:
            continue

    raise ValueError("No descriptor found in `%s'" % (text))

例如

>>> get_descriptor('a descriptor dps 23 fd')
'a descriptor'

简短的回答,正如@THC4K在评论中指出的:

string.split(pattern, 1)[0]

其中string是原始字符串,pattern是“break”模式,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的结果,它返回传递的字符串的索引。

相关问题 更多 >