如何从Python中删除字符串末尾的子字符串?

Ram*_*mya 339 python string

我有以下代码:

url = 'abcdc.com'
print(url.strip('.com'))
Run Code Online (Sandbox Code Playgroud)

我期望: abcdc

我有: abcd

现在我做

url.rsplit('.com', 1)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Ste*_*eef 498

strip并不意味着"删除此子字符串".x.strip(y)视为y一组字符,并从中删除该组中的任何字符x.

相反,你可以使用endswith和切片:

url = 'abcdc.com'
if url.endswith('.com'):
    url = url[:-4]
Run Code Online (Sandbox Code Playgroud)

或使用正则表达式:

import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
Run Code Online (Sandbox Code Playgroud)

  • @yac所以,不要重复自己:`remove ='.com'` ...`url = url [: - len(remove)]` (20认同)
  • `url = url [: - 4] if(url.endswith(x)for x in('.com','.net'))else url` (11认同)
  • 是的,我自己认为第一个带有endswith()测试的例子会更好; 正则表达式会涉及一些性能损失(解析正则表达式等).我不会选择rsplit(),但那是因为我不知道你究竟想要实现什么.我认为它会删除.com当且仅当它出现在网址的末尾?rsplit解决方案会给你带来麻烦,如果你在'www.commercialthingie.co.uk'这样的域名上使用它 (4认同)
  • 虽然第一个是普遍接受的python解决方案,但它是一个糟糕的解决方案,因为它打破了DRY.更改字符串时,还必须更新索引.或者你没有,并得到不必要的行为.丑陋的错误代码.我怪python. (4认同)
  • 它不是一个重写,`rsplit()`解决方案与`endswith()`的解决方案没有相同的行为,当原始字符串在末尾没有子字符串时,但在中间某处.例如:`"www.comeandsee.com".rsplit(".com",1)[0] =="www.comeandsee"`但是"www.comeandsee.net".rsplit(".com",1 )[0] =="www"` (3认同)
  • 语法 `s[:-n]` 有一个警告:对于 `n = 0`,这不会返回最后零个字符被切掉的字符串,而是返回空字符串。 (3认同)

小智 77

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

url = 'abcdc.com'
print(url.replace('.com',''))
Run Code Online (Sandbox Code Playgroud)

  • `"www.computerhope.com".endswith(".com")`是真的,它仍然会破裂! (65认同)
  • 这也将取代像www.computerhope.com`这样的网址.使用`endswith()`进行检查,应该没问题. (49认同)
  • “如果您确定该字符串仅出现在末尾”您的意思是“如果您确定该子字符串仅出现一次”吗?当子字符串位于中间时,替换似乎也起作用,但正如其他评论所暗示的那样,它将替换子字符串的任何出现,为什么它应该在最后我不明白 (2认同)

yai*_*chu 42

def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]
Run Code Online (Sandbox Code Playgroud)

  • 如果你知道后缀不为空(比如它是常量)那么:return text [: - len(suffix)] (3认同)
  • 谢谢。最后一行可以缩短:`return text [:-len(suffix)]` (2认同)

小智 38

因为似乎没有人指出这个问题:

url = "www.example.com"
new_url = url[:url.rfind(".")]
Run Code Online (Sandbox Code Playgroud)

这应该比使用的方法更有效,split()因为没有创建新的列表对象,并且此解决方案适用于具有多个点的字符串.

  • 如果搜索的字符串不存在,则会失败,并且错误地删除了最后一个字符. (11认同)

Xav*_*hot 24

从 开始Python 3.9,您可以使用removesuffix

'abcdc.com'.removesuffix('.com')
# 'abcdc'
Run Code Online (Sandbox Code Playgroud)


dag*_*agw 23

取决于您对您的网址的了解以及您正在尝试做的事情.如果您知道它将始终以'.com'(或'.net'或'.org')结尾

 url=url[:-4]
Run Code Online (Sandbox Code Playgroud)

是最快的解决方案.如果它是一个更通用的URL,那么你可能更好地查看python附带的urlparse库.

另一方面,如果你想在最终''之后删除所有内容.然后在一个字符串中

url.rsplit('.',1)[0]
Run Code Online (Sandbox Code Playgroud)

将工作.或者如果你想要一切都达到第一个'.' 然后试试

url.split('.',1)[0]
Run Code Online (Sandbox Code Playgroud)


Joh*_*tta 10

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

url = 'abcdc.com'
...
url.rsplit('.', 1)[0]  # split at '.', starting from the right, maximum 1 split
Run Code Online (Sandbox Code Playgroud)

这同样适用于abcdc.comwww.abcdc.comabcdc.[anything]更具可扩展性.


Dav*_*ter 10

在一行中:

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Run Code Online (Sandbox Code Playgroud)


Dar*_*mas 7

怎么样url[:-4]

  • 一旦你遇到“.ca”或“.co.uk”网址,似乎几乎肯定会导致错误。 (2认同)

JHo*_*lta 6

对于网址(因为它似乎是给定示例的主题的一部分),可以做这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

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

str.endswith(suffix)如果您只需要拆分".com"或任何特定的内容,也可以将其组合使用.


win*_*i2k 6

DSCLAIMER此方法有一个严重缺陷,即分区未锚定到 url 的末尾,并且可能返回虚假结果。例如,URL“www.comcast.net”的结果是“www”(不正确)而不是预期的“www.comcast.net”。因此,这个解决方案是邪恶的。除非您知道自己在做什么,否则不要使用它!

url.rpartition('.com')[0]
Run Code Online (Sandbox Code Playgroud)

这相当容易输入,并且当 .com 中缺少后缀“.com”时也能正确返回原始字符串(没有错误)url


小智 5

假设您想要删除域名,无论它是什么(.com、.net 等)。我建议找到.并删除从那时起的所有内容。

url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]
Run Code Online (Sandbox Code Playgroud)

这里我用来解决像这样的 url 应该简化为 namerfind的问题。abcdc.com.netabcdc.com

如果您还担心www.s,则应该明确检查它们:

if url.startswith("www."):
   url = url.replace("www.","", 1)
Run Code Online (Sandbox Code Playgroud)

替换中的 1 用于奇怪的边缘情况,例如www.net.www.com

如果您的网址变得比这更狂野,请查看人们回复的正则表达式答案。