У мене є такий код:
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)
Чи є кращий спосіб?
Відповіді:
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]
є застереження: адже 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-адресу і що саме ви намагаєтеся робити. Якщо ви знаєте, що він завжди закінчуватиметься в '.com' (або '.net' або '.org')
url=url[:-4]
- найшвидше рішення. Якщо це більш загальні URL-адреси, то вам, мабуть, краще заглянути в бібліотеку urlparse, яка постачається з python.
Якщо ви, з іншого боку, просто хочете видалити все після фіналу ". то в рядку
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.rsplit ('. com', 1)
не зовсім правильно.
Те, що вам насправді потрібно було б написати, - це
url.rsplit('.com', 1)[0]
, і це виглядає досить лаконічно IMHO.
Однак мої особисті переваги - це цей варіант, оскільки він використовує лише один параметр:
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. Варіант регулярного виразів швидше, ніж це практично для всіх випадків, що не включають величезні словники потенційних суфіксів, які не можуть бути легко представлені як регулярні вирази принаймні в cPython.
У PyPy варіант регулярного виведення майже напевно повільніше для великої кількості дзвінків або довгих рядків, навіть якщо модуль повторного використання використовує DFA-компілюючий регекс-движок, оскільки переважна більшість накладних витрат лямбда буде оптимізована JIT.
У cPython, однак, той факт, що ваш запущений код коду для регулярних виразів, майже напевно порівнює способи алгоритмічних переваг версії суффіксного збірника майже у всіх випадках.
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Я хочу повторити цю відповідь як найвиразніший спосіб це зробити. Зрозуміло, для процесора потрібно менше часу:
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Однак якщо CPU - це горлечко для пляшок, чому б писати в Python?
Коли процесор все-таки є шийкою пляшки? У водіїв, можливо.
Перевагами використання регулярного вираження є повторне використання коду. Що робити, якщо ви бажаєте видалити ".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
які слід звести до назви abcdc.com
.
Якщо ви також стурбовані www.
s, вам слід чітко перевірити їх:
if url.startswith("www."):
url = url.replace("www.","", 1)
1 заміни призначений для дивних крайових випадків www.net.www.com
Якщо ваша URL-адреса стає дивішою, ніж це дивіться на відповіді з питань регулярного вираження, на які люди відповіли.
Я використовував вбудовану функцію 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')
Пітон <3,9:
def remove_suffix(text, suffix):
if text.endswith(suffix):
text = text[:-len(suffix)]
return text
remove_suffix('abcdc.com', '.com')