我有以下代码:
url = 'abcdc.com'
print(url.strip('.com'))
我期望: abcdc
我有: abcd
现在我做
url.rsplit('.com', 1)
有没有更好的办法?
我有以下代码:
url = 'abcdc.com'
print(url.strip('.com'))
我期望: abcdc
我有: abcd
现在我做
url.rsplit('.com', 1)
有没有更好的办法?
Answers:
strip
并不意味着“删除此子字符串”。x.strip(y)
视为y
一组字符,并从的末尾剥离该组中的所有字符x
。
相反,您可以使用endswith
和切片:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
或使用正则表达式:
import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
域名不区分大小写该怎么办。(这是对正则表达式解决方案的投票)
rsplit()
解决方案的行为endswith()
与原始字符串末尾没有子字符串而是在中间某处时的行为不同。例如:"www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
但是"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
有一个警告:for n = 0
,它不会返回被切掉最后零个字符的字符串,而是返回空字符串。
如果您确定字符串仅出现在末尾,则最简单的方法是使用“替换”:
url = 'abcdc.com'
print(url.replace('.com',''))
www.computerhope.com
。做检查,endswith()
应该没问题。
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
return text[:-len(suffix)]
由于似乎没有人指出这一点:
url = "www.example.com"
new_url = url[:url.rfind(".")]
这应该比split()
不使用任何新列表对象的方法更有效,并且此解决方案适用于带有多个点的字符串。
怎么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.rsplit('。com',1)
不太正确。
您实际需要写的是
url.rsplit('.com', 1)[0]
,而且恕我直言。
但是,我个人偏爱此选项,因为它仅使用一个参数:
url.rpartition('.com')[0]
从开始Python 3.9
,您可以removesuffix
改用:
'abcdc.com'.removesuffix('.com')
# 'abcdc'
如果需要剥离某个字符串的某个末端(如果存在),否则什么也不做。我最好的解决方案。您可能会想使用前两个实现之一,但是为了完整起见,我包括了第三个实现。
对于恒定的后缀:
def remove_suffix(v, s):
return v[:-len(s) if v.endswith(s) else v
remove_suffix("abc.com", ".com") == 'abc'
remove_suffix("abc", ".com") == 'abc'
对于正则表达式:
def remove_suffix_compile(suffix_pattern):
r = re.compile(f"(.*?)({suffix_pattern})?$")
return lambda v: r.match(v)[1]
remove_domain = remove_suffix_compile(r"\.[a-zA-Z0-9]{3,}")
remove_domain("abc.com") == "abc"
remove_domain("sub.abc.net") == "sub.abc"
remove_domain("abc.") == "abc."
remove_domain("abc") == "abc"
对于常量后缀的集合,用于大量调用的渐近最快方法:
def remove_suffix_preprocess(*suffixes):
suffixes = set(suffixes)
try:
suffixes.remove('')
except KeyError:
pass
def helper(suffixes, pos):
if len(suffixes) == 1:
suf = suffixes[0]
l = -len(suf)
ls = slice(0, l)
return lambda v: v[ls] if v.endswith(suf) else v
si = iter(suffixes)
ml = len(next(si))
exact = False
for suf in si:
l = len(suf)
if -l == pos:
exact = True
else:
ml = min(len(suf), ml)
ml = -ml
suffix_dict = {}
for suf in suffixes:
sub = suf[ml:pos]
if sub in suffix_dict:
suffix_dict[sub].append(suf)
else:
suffix_dict[sub] = [suf]
if exact:
del suffix_dict['']
for key in suffix_dict:
suffix_dict[key] = helper([s[:pos] for s in suffix_dict[key]], None)
return lambda v: suffix_dict.get(v[ml:pos], lambda v: v)(v[:pos])
else:
for key in suffix_dict:
suffix_dict[key] = helper(suffix_dict[key], ml)
return lambda v: suffix_dict.get(v[ml:pos], lambda v: v)(v)
return helper(tuple(suffixes), None)
domain_remove = remove_suffix_preprocess(".com", ".net", ".edu", ".uk", '.tv', '.co.uk', '.org.uk')
最后一个在pypy中可能要比cpython快得多。对于几乎所有不涉及潜在后缀的巨大词典的情况,regex变体可能比此方法更快,至少在cPython中这些潜在后缀无法轻易地表示为regex。
在PyPy中,即使re模块使用DFA编译正则表达式引擎,对于大量调用或长字符串来说,正则表达式变体几乎肯定会变慢,因为JIT会优化lambda的大部分开销。
但是,在cPython中,您几乎可以肯定地比较了正在运行的regex的c代码这一事实,这几乎可以证明后缀集合版本在算法上的优势。
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
我想重复这个答案,以此作为最有表现力的方式。当然,以下操作会减少CPU时间:
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
但是,如果CPU是瓶颈,为什么要用Python编写?
无论如何,CPU何时会成为瓶颈?在司机中,也许。
使用正则表达式的优点是代码可重用性。如果下一个要删除只有三个字符的'.me'怎么办?
相同的代码可以解决问题:
>>> rm_sub('abcdc.me','.me')
'abcdc'
就我而言,我需要提出一个例外,所以我做到了:
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=url.split(".")[0]
假定您要删除域,无论它是什么(.com,.net等)。我建议找到,.
然后从此删除所有内容。
url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]
在这里,我rfind
用来解决url之类的问题abcdc.com.net
,应该将其简化为name abcdc.com
。
如果您还担心www.
s,则应明确检查它们:
if url.startswith("www."):
url = url.replace("www.","", 1)
替换中的1用于奇怪的边缘情况,例如 www.net.www.com
如果您的网址比该网址更野,请查看人们响应的正则表达式答案。
我使用内置的rstrip函数来执行此操作,如下所示:
string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test
"test.ccom"
。
这是正则表达式的完美用法:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
Python> = 3.9:
'abcdc.com'.removesuffix('.com')
Python <3.9:
def remove_suffix(text, suffix):
if text.endswith(suffix):
text = text[:-len(suffix)]
return text
remove_suffix('abcdc.com', '.com')