Saya punya kode berikut:
url = 'abcdc.com'
print(url.strip('.com'))
Yang saya harapkan: abcdc
Aku punya: abcd
Sekarang yang saya lakukan
url.rsplit('.com', 1)
Apakah ada cara yang lebih baik?
strip
doesn't berarti "menghapus substring". x.strip(y)
memperlakukan y
sebagai satu set karakter dan strip setiap karakter yang membedakan 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)
Jika anda yakin bahwa string yang hanya muncul di akhir, maka cara paling sederhana adalah dengan menggunakan 'mengganti':
url = 'abcdc.com'
print(url.replace('.com',''))
Karena sepertinya tidak ada yang telah menunjuk ini keluar belum:
url = "www.example.com"
new_url = url[:url.rfind(".")]
Ini harus lebih efisien daripada menggunakan metode split()` tidak ada yang baru daftar objek dibuat, dan solusi ini bekerja untuk string dengan beberapa titik-titik.
Tergantung pada apa yang anda tahu tentang url anda dan apa yang anda're tryinh untuk dilakukan. Jika anda tahu bahwa itu akan selalu berakhir di '.com' (atau '.net' atau '.org') kemudian
url=url[:-4]
adalah solusi tercepat. Jika itu's yang lebih umum Url maka anda're mungkin lebih baik melihat ke urlparse perpustakaan yang dilengkapi dengan python.
Jika di sisi lain anda hanya ingin menghapus semuanya setelah akhir '.' di sebuah string maka
url.rsplit('.',1)[0]
akan bekerja. Atau jika anda ingin hanya ingin semuanya untuk pertama '.' kemudian mencoba
url.split('.',1)[0]
Jika anda tahu itu's perpanjangan, maka
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
Ini bekerja sama dengan baik dengan abcdc.com
atau www.abcdc.com
atau abcdc.[apapun]
dan lebih extensible.
Untuk url (seperti yang tampaknya menjadi bagian dari topik dengan contoh yang diberikan), seseorang 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 output:
('http://www.stackoverflow', '.com')
Ini juga dapat dikombinasikan dengan str.endswith(akhiran)
jika anda hanya perlu membagi ".com", atau sesuatu yang spesifik.
url.rsplit('.com', 1)
adalah tidak benar.
Apa yang sebenarnya anda akan perlu untuk menulis
url.rsplit('.com', 1)[0]
dan ini terlihat cukup ringkas IMHO.
Namun, preferensi pribadi saya adalah opsi ini karena hanya menggunakan satu parameter:
url.rpartition('.com')[0]
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Aku ingin mengulang jawaban ini sebagai yang paling ekspresif cara untuk melakukannya. Tentu saja, berikut ini akan mengambil sedikit waktu CPU
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Namun, jika CPU adalah leher botol mengapa menulis di Python?
Saat ini CPU leher botol sih?? dalam driver , mungkin.
Keuntungan menggunakan ekspresi reguler adalah kode usabilitas. Bagaimana jika anda selanjutnya ingin menghapus '.saya' , yang hanya memiliki tiga karakter?
Kode yang sama akan melakukan trik.
>>> rm_sub('abcdc.me','.me')
'abcdc'
Jika anda bermaksud untuk strip hanya ekstensi
url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))
Ia bekerja dengan ekstensi apapun, dengan potensi titik-titik lainnya yang ada di nama file juga. Itu hanya membagi string untuk daftar pada titik-titik, dan bergabung tanpa elemen terakhir.
Mungkin bukan yang tercepat, tapi bagi saya itu's lebih mudah dibaca daripada metode lain.
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
Dalam kasus saya saya dibutuhkan untuk menaikkan pengecualian jadi yang saya lakukan:
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)]