如何从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.com
或www.abcdc.com
或abcdc.[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只从后面去掉。