Saya memiliki kode berikut:
url = 'abcdc.com'
print(url.strip('.com'))
Saya mengharapkan: abcdc
Saya mendapatkan: abcd
Sekarang saya lakukan
url.rsplit('.com', 1)
Apakah ada cara yang lebih baik?
Saya memiliki kode berikut:
url = 'abcdc.com'
print(url.strip('.com'))
Saya mengharapkan: abcdc
Saya mendapatkan: abcd
Sekarang saya lakukan
url.rsplit('.com', 1)
Apakah ada cara yang lebih baik?
Jawaban:
strip
tidak berarti "hapus substring ini". x.strip(y)
memperlakukan y
sebagai satu set karakter dan menghapus setiap karakter dalam set itu dari ujung x
.
Sebagai gantinya, Anda bisa menggunakan endswith
dan mengiris:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
Atau menggunakan ekspresi reguler :
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
nama domain tidak peka huruf besar-kecil. (Ini adalah suara untuk solusi regex)
rsplit()
solusinya tidak memiliki perilaku yang sama dengan yang endswith()
ketika string asli tidak memiliki substring di akhir, tetapi di suatu tempat di tengah. Misalnya: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
tetapi"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
memiliki peringatan: untuk n = 0
, ini tidak mengembalikan string dengan nol karakter terakhir dipotong, tetapi string kosong sebagai gantinya.
Jika Anda yakin bahwa string hanya muncul di bagian akhir, maka cara paling sederhana adalah menggunakan 'ganti':
url = 'abcdc.com'
print(url.replace('.com',''))
www.computerhope.com
. lakukan cek dengan endswith()
dan harus baik-baik saja.
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
return text[:-len(suffix)]
Karena sepertinya belum ada yang menunjukkan hal ini:
url = "www.example.com"
new_url = url[:url.rfind(".")]
Ini harus lebih efisien daripada metode yang digunakan split()
karena tidak ada objek daftar baru dibuat, dan solusi ini berfungsi untuk string dengan beberapa titik.
Bergantung pada apa yang Anda ketahui tentang url Anda dan apa yang Anda coba lakukan. Jika Anda tahu bahwa itu akan selalu berakhir dengan '.com' (atau '.net' atau '.org'), maka
url=url[:-4]
adalah solusi tercepat. Jika itu URL yang lebih umum maka Anda mungkin lebih baik melihat ke perpustakaan urlparse yang dilengkapi dengan python.
Jika Anda di sisi lain, Anda hanya ingin menghapus semuanya setelah final '.' dalam sebuah string kemudian
url.rsplit('.',1)[0]
akan bekerja. Atau jika Anda ingin hanya menginginkan semuanya hingga yang pertama '.' lalu coba
url.split('.',1)[0]
Dalam satu baris:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Bagaimana dengan url[:-4]
?
.ca
atau .co.uk
url.
Untuk url (karena tampaknya menjadi bagian dari topik dengan contoh yang diberikan), orang dapat melakukan sesuatu seperti ini:
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)
Keduanya akan menampilkan:
('http://www.stackoverflow', '.com')
Ini juga dapat digabungkan dengan str.endswith(suffix)
jika Anda hanya perlu membagi ".com", atau apa pun yang spesifik.
url.rsplit ('. com', 1)
tidak benar.
Apa yang sebenarnya perlu Anda tulis adalah
url.rsplit('.com', 1)[0]
, dan itu terlihat IMHO cukup ringkas.
Namun, preferensi pribadi saya adalah opsi ini karena hanya menggunakan satu parameter:
url.rpartition('.com')[0]
Mulai di Python 3.9
, Anda dapat menggunakan removesuffix
sebagai gantinya:
'abcdc.com'.removesuffix('.com')
# 'abcdc'
Jika Anda perlu menghapus beberapa ujung string jika ada, lakukan apa-apa. Solusi terbaik saya Anda mungkin ingin menggunakan salah satu dari 2 implementasi pertama namun saya telah memasukkan 3 untuk kelengkapan.
Untuk akhiran konstan:
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'
Untuk regex:
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"
Untuk koleksi sufiks konstan, cara tercepat tanpa asimptot untuk sejumlah besar panggilan:
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')
yang terakhir mungkin secara signifikan lebih cepat di pypy kemudian cpython. Varian regex kemungkinan lebih cepat dari ini untuk hampir semua kasus yang tidak melibatkan kamus besar sufiks potensial yang tidak dapat dengan mudah direpresentasikan sebagai regex setidaknya dalam cPython.
Dalam PyPy varian regex hampir pasti lebih lambat untuk sejumlah besar panggilan atau string panjang bahkan jika modul ulang menggunakan mesin kompilasi regex DFA karena sebagian besar overhead dari lambda akan dioptimalkan oleh JIT.
Namun dalam cPython fakta bahwa Anda menjalankan kode c untuk regex membandingkan hampir pasti cara keuntungan algoritmik dari versi koleksi suffix di hampir semua kasus.
Jika Anda bermaksud hanya menghapus ekstensi:
'.'.join('abcdc.com'.split('.')[:-1])
# 'abcdc'
Ia bekerja dengan ekstensi apa pun, dengan titik-titik potensial lainnya yang ada dalam nama file juga. Ini hanya membagi string sebagai daftar pada titik-titik dan bergabung tanpa elemen terakhir.
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Saya ingin mengulangi jawaban ini sebagai cara paling ekspresif untuk melakukannya. Tentu saja, yang berikut ini akan memakan waktu lebih singkat:
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Namun, jika CPU adalah leher botol mengapa menulis dengan Python?
Kapan CPU menjadi leher botol? Di driver, mungkin.
Keuntungan menggunakan ekspresi reguler adalah penggunaan kembali kode. Bagaimana jika Anda selanjutnya ingin menghapus '.me', yang hanya memiliki tiga karakter?
Kode yang sama akan melakukan trik:
>>> rm_sub('abcdc.me','.me')
'abcdc'
Dalam kasus saya, saya perlu mengajukan pengecualian sehingga saya melakukannya:
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)]
Di sini, saya punya kode paling sederhana.
url=url.split(".")[0]
Dengan asumsi Anda ingin menghapus domain, apa pun itu (.com, .net, dll). Saya sarankan untuk menemukan .
dan menghapus semuanya sejak saat itu.
url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]
Di sini saya menggunakan rfind
untuk memecahkan masalah url seperti abcdc.com.net
yang harus direduksi menjadi namanya abcdc.com
.
Jika Anda juga khawatir tentang www.
s, Anda harus secara eksplisit memeriksanya:
if url.startswith("www."):
url = url.replace("www.","", 1)
1 di ganti adalah untuk edgecases aneh seperti www.net.www.com
Jika url Anda menjadi lebih liar dari itu, lihat pada regex jawaban yang telah ditanggapi orang.
Saya menggunakan fungsi rstrip bawaan untuk melakukannya seperti ikuti:
string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test
"test.ccom"
.
Ini adalah penggunaan yang sempurna untuk ekspresi reguler:
>>> 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')