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


147

我有一个字符串。如何删除某个字符后的所有文本?(在这种情况下...)之后
的文本将...更改,所以这就是为什么我要删除某个字符之后的所有字符的原因。


6
如果您不确定这样做是否合理,请更新您的问题以提供您想做什么的特定示例。
S.Lott

Answers:


259

最多在分隔器上分割一次,然后取下第一块:

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

您没有说如果不使用分隔符该怎么办。在这种情况下,此方法和Alex的解决方案都将返回整个字符串。


请求是“删除之后的所有文本”分隔符,而不是“获取”该文本,因此,我认为您想以[0]而不是[-1]来解决您的其他出色解决方案。
亚历克斯·马丁里

非常感谢,因为我确定Ayman&Alex's也是如此,所以谢谢大家。
索利哈尔

5
如果需要从字符串末尾开始的字符进行分割,请使用rsplit()。
塞缪尔

rsplit()实际上回答了是否存在多次分隔符的问题
Nate

93

假设分隔符为“ ...”,但它可以是任何字符串。

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

>>> print head
some string

如果找不到分隔符,head将包含所有原始字符串。

分区功能是在Python 2.5中添加的。

分区(...)S.partition(sep)->(head,sep,tail)

Searches for the separator sep in S, and returns the part before it,
the separator itself, and the part after it.  If the separator is not
found, returns S and two empty strings.

另一个出色的解决方案-我们违反TOOOWTDI吗?-)也许值得花点时间检查一下……
亚历克斯·

9
.partition获胜-每个循环0.756 usc,而.split则为1.13(注释格式并没有真正让我显示确切的测试,但我使用的是@Ayman的文本和分隔符)-因此,@ Ayman的答案为+1 !
亚历克斯·马蒂利

1
顺便说一句,为完整起见,基于RE的解决方案是2.54微秒,即比@Ayman或@Ned慢。
亚历克斯·马丁里

如果您在2.5土地上,分区将获胜:)对于我们陷在2.4中的吸盘,我们必须生活在相对缓慢的分裂中。
Gregg Lind)

例子真的很有帮助。
萨比尔·艾哈迈德(Ms. Sabbir Ahmed)

18

如果要删除字符串中最后一次出现分隔符之后的所有内容,我会发现这很有效:

<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

10

没有RE(我想是您想要的):

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

或者,使用RE:

import re

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

可能希望使用sep ='...'作为kwarg,并使用len(sep)而不是对3进行硬编码,以使其更具前瞻性。
cdleary

是的,但是随后您需要在每次调用时重新编译RE,因此RE解决方案的性能会受到影响(非RE解决方案没有真正的区别)。有些通用性是免费的,有些则不是... ;-)
亚历克斯·马丁里

@Alex-感谢您测试解决方案!
艾曼·胡里厄

2

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

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

>> '123'

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


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

输出:“这是一个测试”


好心请解释
lone_coder

1

从文件中:

import re
sep = '...'

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

0

使用re的另一种简单方法是

import re, clr

text = 'some string... this part will be removed.'

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1)

// text = some string
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.