如何在Python中删除特定字符后的所有字符?

236

我有一个字符串,如何删除某个字符后面的所有文本?(在这种情况下是 ...
之后的文本...会变化,因此我想要删除某个特定字符后面的所有字符。

11个回答

398

在分隔符上最多拆分一次,并取第一个片段:

sep = '...'
stripped = text.split(sep, 1)[0]

您没有说明如果分隔符不存在应该发生什么。在这种情况下,无论是此解决方案还是Alex的解决方案都将返回整个字符串。


请求是“删除分隔符后的所有文本”,而不是“获取”该文本,所以我认为你想要[0],而不是[-1],在你其他方面非常出色的解决方案中。 - Alex Martelli
非常感谢,一切都很完美,我相信Ayman和Alex的也是,所以谢谢你们所有人。 - Solihull
15
如果您需要根据字符串结尾处的字符进行拆分,则可以使用rsplit()函数。 - Samuel
rsplit() 实际上回答了这个问题,即分隔符是否有多个出现。 - Nate

135

假设你的分隔符是'...',但它可以是任何字符串。

text = 'some string... this part will be removed.'
head, sep, tail = text.partition('...')

>>> print head
some string
如果没有找到分隔符,head 将包含原始字符串的全部内容。 partition 函数在 Python 2.5 中被添加。 S.partition(sep) -> (head, sep, tail) 在字符串 S 中搜索分隔符 sep,并返回分隔符前面的部分、分隔符本身和分隔符后面的部分。如果没有找到分隔符,则返回S和两个空字符串。

又一个出色的解决方案 - 我们是否违反了 TOOOWTDI?也许值得进行 timeit 运行来检查一下... - Alex Martelli
9
使用.partition方法的速度为0.756微秒每次循环,而使用.split方法的速度为1.13微秒(注释格式不允许我准确显示测试内容,但我使用了@Ayman提供的文本和分隔符)-- 因此,对于@Ayman的答案加上+1! - Alex Martelli
1
顺便提一下,为了完整起见,基于RE的解决方案需要2.54微秒,即比@Ayman或@Ned的都要慢。 - Alex Martelli
如果你使用的是2.5版本,那么分区操作会更加高效。但对于我们这些被困在2.4版本的可怜人来说,我们只能忍受相对缓慢的拆分操作。 - Gregg Lind
示例非常有帮助。 - Md. Sabbir Ahmed
小改进,如果您不需要它们,可以简单地丢弃其他值:head,* _ = text.partition('...') - Sigmatics

31
如果你想删除一个字符串中最后一次出现分隔符之后的所有内容,我发现以下代码能够很好地实现: <separator>.join(string_to_split.split(<separator>)[:-1]) 例如,如果string_to_split是像root/location/child/too_far.exe这样的路径,而你只需要文件夹路径,你可以使用"/".join(string_to_split.split("/")[:-1]) 分割,从而得到 root/location/child

1
此外,您可以将-1更改为任何索引,以便在哪个位置删除文本。 - theannouncer
这是最灵活的解决方案。 - undefined

11

没有使用正则表达式(我假设这是您想要的):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

或者,使用正则表达式:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)

可能想要使用sep='...'作为关键字参数,并使用len(sep)代替硬编码的3,使其稍微具有更好的兼容性。 - cdleary
是的,但是每次调用都需要重新编译RE,因此RE解决方案的性能会受到影响(对于非RE解决方案没有实质性差异)。一些普遍性是免费的,一些则不是...;-) - Alex Martelli
@Alex - 感谢您测试解决方案! - Ayman Hourieh

6
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

输出结果:"This is a test"


kindly please explain - greendino

4

方法find将返回字符串中的字符位置。然后,如果您想从该字符删除所有内容,请执行以下操作:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

如果想保留字符,请在字符位置上加1。

3

从文件中获取:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)

1

0

另一种在字符串中删除最后一个字符之后的所有字符的方法(假设您想要删除最后一个“/”之后的所有字符)。

path = 'I/only/want/the/containing/directory/not/the/file.txt'

while path[-1] != '/':
    path = path[:-1]

我认为这会在每次迭代时创建path的新副本,因此它并不是特别高效的解决方案,尽管我同意它应该可以工作。 - joanis

0
这是在Python 3.7中对我有效的代码。 在我的情况下,我需要从字符串变量fees中删除小数点后面的内容。
fees = 45.05 split_string = fees.split(".", 1)
substring = split_string[0] print(substring)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接