在某个短语后切字符串?

发布于 2021-01-29 16:26:37

我有一些需要减少的弦。它们基本上是一个描述符,后跟代码。我只想保留描述符。

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

上面的代码dps23fd。它们可以以任何顺序出现,彼此无关,也可能根本不存在(与上一种情况一样)。

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

我正在使用Python。

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    简短的答案,如@ 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'
    

    这基本上是说:对于每个patin 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,它返回您传递的字符串的索引。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看