如何从Python中的string末尾删除子string?

我有以下代码:

url = 'abcdc.com' print(url.strip('.com')) 

我期望: abcdc

我得到了: abcd

现在我做了

 url.rsplit('.com', 1) 

有没有更好的办法?

你可以这样做:

 url = 'abcdc.com' if url.endswith('.com'): url = url[:-4] 

或者使用正则expression式:

 import re url = 'abcdc.com' url = re.sub('\.com$', '', url) 

如果你确定string只出现在最后,那么最简单的方法就是使用'replace':

 url = 'abcdc.com' print url.replace('.com','') 
 def strip_end(text, suffix): if not text.endswith(suffix): return text return text[:len(text)-len(suffix)] 

由于似乎没有人指出这一点:

 url = "www.example.com" new_url = url[:url.rfind(".")] 

由于没有创build新的列表对象,因此这应该比使用split()的方法更高效,而且这种解决scheme适用于有多个点的string。

取决于你对url的了解,以及你想要做什么。 如果你知道它总是以'.com'(或'.net'或'.org')结尾的话

  url=url[:-4] 

是最快的解决scheme。 如果它是一个更一般的URL,那么你可能更好的研究python附带的urlparse库。

如果你另一方面,你只是想在最后的'。 在一个string然后

 url.rsplit('.',1)[0] 

将工作。 或者如果你只想要一切到第一个'。 然后尝试

 url.split('.',1)[0] 

在一行中:

 text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)] 

如何url[:-4]

对于url(因为它似乎是这个例子中的主题的一部分),可以这样做:

 import os url = 'http://www.stackoverflow.com' name,ext = os.path.splitext(url) print (name, ext) #Or: ext = '.'+url.split('.')[-1] name = url[:-len(ext)] print (name, ext) 

两者都会输出: ('http://www.stackoverflow', '.com')

这也可以结合str.endswith(suffix)如果你只需要拆分“.com”,或任何具体的。

如果你知道这是一个扩展,那么

   url ='abcdc.com'
   ...
   url.rsplit('。',1)[0]#分割为'。',从右边开始,最大为1

这与abcdc.comwww.abcdc.comabcdc.[anything]同样适用,并且更具可扩展性。

 import re def rm_suffix(url = 'abcdc.com', suffix='\.com'): return(re.sub(suffix+'$', '', url)) 

我想重复这个答案作为最有performance力的方式来做到这一点。 当然,以下几点会花费更less的CPU时间

 def rm_dotcom(url = 'abcdc.com'): return(url[:-4] if url.endswith('.com') else url) 

但是,如果CPU是瓶颈,为什么写在Python?

什么时候CPU是一个瓶颈呢? 在司机,也许。

使用正则expression式的优点是代码可重用性。 如果你接下来要删除只有三个字符的“.me”呢?

相同的代码会做的伎俩。

 >>> rm_sub('abcdc.me','.me') 'abcdc' 

这是正则expression式的完美用法:

 >>> import re >>> re.match(r"(.*)\.com", "hello.com").group(1) 'hello' 

或者你可以使用分割:

 a = 'abccomputer.com' res = a.split('.com',1)[0] 
 def remove_file_type(infile): import re return(re.sub('\.[^.]*$','',infile)) remove_file_type('abc.efg')'abc' 

在我的情况下,我需要提出一个例外,所以我做了:

 class UnableToStripEnd(Exception): """A Exception type to indicate that the suffix cannot be removed from the text.""" @staticmethod def get_exception(text, suffix): return UnableToStripEnd("Could not find suffix ({0}) on text: {1}." .format(suffix, text)) def strip_end(text, suffix): """Removes the end of a string. Otherwise fails.""" if not text.endswith(suffix): raise UnableToStripEnd.get_exception(text, suffix) return text[:len(text)-len(suffix)] 

url.rsplit('。com',1)

不太对劲。

你实际上需要写的是

 url.rsplit('.com', 1)[0] 

,它看起来很简洁恕我直言。

不过,我个人的偏好是这个选项,因为它只使用一个参数:

 url.rpartition('.com')[0] 

如果你的意思是剥离只有扩展名

 url = 'abcdc.com' print('.'.join(url.split('.')[:-1])) 

它适用于任何扩展名,以及文件名中可能存在的其他点。 它只是将string拆分为点列表,并将其连接起来而没有最后一个元素。

可能不是最快的,但对我来说,它比其他方法更可读。

我没有看到你用rsplit做的方式有什么问题,它确实是你想要的。 这完全取决于你想要解决scheme的通用性。 你总是想删除.com,或者它有时会是.org? 如果是这种情况,请使用其他解决scheme之一,否则,请使用rsplit()

strip()不能以你期望的方式工作的原因是它可以在每个字符上单独运行。 它会扫描你的string,并从结尾和前面删除所有出现的字符。 所以如果你的string是以'c'开始的,那么也会消失。 你会使用rstrip只从后面去掉。