मेरे पास निम्नलिखित कोड हैं:
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()
नई सूची ऑब्जेक्ट के रूप में उपयोग किए जाने वाले तरीकों की तुलना में यह अधिक कुशल होना चाहिए , और यह समाधान कई बिंदुओं के साथ तार के लिए काम करता है।
इस बात पर निर्भर करता है कि आप अपने यूआरएल के बारे में क्या जानते हैं और वास्तव में आप क्या करने की कोशिश कर रहे हैं। यदि आप जानते हैं कि यह हमेशा '.com' (या '.net' या '.org') में समाप्त होगा
url=url[:-4]
सबसे तेज उपाय है। यदि यह एक अधिक सामान्य URL है तो आप शायद उन urlparse लाइब्रेरी में देखने से बेहतर हैं जो अजगर के साथ आती हैं।
यदि आप दूसरी ओर आप बस फाइनल के बाद सब कुछ निकालना चाहते हैं '।' एक तार में तब
url.rsplit('.',1)[0]
काम करेगा। या अगर आप चाहते हैं कि सब कुछ पहले तक हो जाए '।' फिर कोशिश करो
url.split('.',1)[0]
एक पंक्ति में:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Urls के लिए (जैसा कि दिए गए उदाहरण से विषय का एक हिस्सा लगता है), कोई इस तरह से कर सकता है:
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'
यदि आपको स्ट्रिंग के कुछ छोर को स्ट्रिप करने की आवश्यकता है यदि यह मौजूद है तो अन्यथा कुछ भी नहीं करें। मेरा सबसे अच्छा समाधान। आप शायद पहले 2 कार्यान्वयन में से एक का उपयोग करना चाहेंगे, लेकिन मैंने पूर्णता के लिए 3 को शामिल किया है।
एक निरंतर प्रत्यय के लिए:
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 में रेगेक्स वैरिएंट निश्चित रूप से बड़ी संख्या में कॉल या लंबे स्ट्रिंग्स के लिए धीमा है, भले ही री मॉड्यूल एक डीएफए संकलन रेगेक्स इंजन का उपयोग करता है क्योंकि लैम्बडा के ओवरहेड के विशाल बहुमत को जेआईटी द्वारा अनुकूलित किया जाएगा।
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 बोतल गर्दन है तो पायथन में क्यों लिखें?
सीपीयू वैसे भी एक बोतल गर्दन है? ड्राइवरों में, हो सकता है।
नियमित अभिव्यक्ति का उपयोग करने के फायदे कोड पुन: प्रयोज्य हैं। यदि आप अगली बार '.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
urls की समस्या को हल करने के लिए उपयोग कर रहा हूँ जैसे abcdc.com.net
कि नाम को कम किया जाना चाहिए abcdc.com
।
यदि आप भी www.
एस के बारे में चिंतित हैं , तो आपको उनके लिए स्पष्ट रूप से जांच करनी चाहिए:
if url.startswith("www."):
url = url.replace("www.","", 1)
1 में प्रतिस्थापित अजीब edgecases की तरह है 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'
पायथन> = 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')