পাইথনের স্ট্রিংয়ের শেষে থেকে আমি কীভাবে একটি স্ট্রিংং সরিয়ে ফেলব?


381

আমার কাছে নিম্নলিখিত কোড রয়েছে:

url = 'abcdc.com'
print(url.strip('.com'))

আমি আশা করেছিলাম: abcdc

আমি পেয়েছি: abcd

এখন আমি করি

url.rsplit('.com', 1)

একটি ভাল উপায় আছে কি?


6
স্ট্রিপটি স্ট্রিংয়ের উভয় প্রান্ত থেকে দেওয়া অক্ষরগুলি স্ট্রিপগুলি সরিয়ে দেয়, আপনার ক্ষেত্রে এটি "।", "সি", "ও" এবং "এম" কেটে যায়।
truppo

6
এটি স্ট্রিংয়ের সামনে থেকে এই অক্ষরগুলিও সরিয়ে ফেলবে। আপনি যদি কেবল এটিকে শেষ থেকে সরাতে চান তবে স্ট্রাইপ () ব্যবহার করুন
আন্দ্রে মিলার

42
হ্যাঁ। str.strip আপনি যা মনে করেন তা করেন না। স্ট্রিং স্ট্রিপ স্ট্রিংয়ের শুরু এবং শেষ থেকে বর্ণিত যে কোনও অক্ষর মুছে ফেলে। সুতরাং, "আকবদা"। স্ট্রিপ ("বিজ্ঞাপন") 'সিবিসি' দেয়; শুরুতে একটি এবং শেষদিকে দা ছিনিয়ে নেওয়া হয়েছিল। চিয়ার্স।
scvalex

2
এছাড়াও, এটি কোনও ক্রমে অক্ষরগুলি সরিয়ে দেয় : "সাইট.ocm"> "সাইট"।
এরিক হে লেবিগোট

1
@ এসভ্যালেক্স, বাহ ঠিক বুঝতে পেরেছিল যে এটি যুগ যুগ ধরে এটি ব্যবহার করা হয়েছে - এটি বিপজ্জনক কারণ কোডটি প্রায়শই যে কোনওভাবেই কাজ করতে পারে
ফ্ল্যাশ

উত্তর:


555

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)

4
হ্যাঁ, আমি নিজেই মনে করি যে শেষ উদাহরণ () এর পরীক্ষা দিয়ে প্রথম উদাহরণটি আরও ভাল হবে; রেজেক্স একের মধ্যে কিছু পারফরম্যান্স জরিমানা (রেজেক্স পার্সিং ইত্যাদি) জড়িত। আমি আরএসপিপ্লিট () এর সাথে যাব না, তবে এটি কারণ আপনি ঠিক কী অর্জন করার চেষ্টা করছেন তা আমি জানি না। আমি অনুভব করছি এটি .com অপসারণ করছে যদি এবং কেবল এটি ইউআরএল শেষে প্রদর্শিত হয়? আরএসপ্লিট সমাধান আপনাকে সমস্যা দেবে যদি আপনি এটি 'www.commercialthingie.co.uk' এর মতো ডোমেন নামগুলিতে ব্যবহার করেন
স্টিফ

13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
বুরহান খালিদ

1
আমি যদি EXAMLPLE.COMডোমেনের নামগুলি লিখি তবে সংবেদনশীল নয়। (এটি রেজেজেক্স সমাধানের পক্ষে একটি ভোট)
জেসেন

3
এটি কোনও পুনর্লিখন নয়, মূল স্ট্রিংটির শেষে যখন স্ট্রাস্টিং থাকে না তখন rsplit()সমাধানটির মতো একই আচরণ endswith()হয় না তবে কোথাও মাঝখানে থাকে। উদাহরণস্বরূপ: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"তবে"www.comeandsee.net".rsplit(".com",1)[0] == "www"
স্টিফ

1
সিনট্যাক্সটিতে s[:-n]একটি সতর্কতা রয়েছে: কারণ n = 0এটি শেষ শূন্য অক্ষরের সাথে কাটা কাটাটি দিয়ে স্ট্রিংটি ফিরিয়ে দেয় না, পরিবর্তে খালি স্ট্রিংটি।
ব্লেন্ডারবেন্ডার

90

আপনি যদি নিশ্চিত হন যে স্ট্রিংটি কেবল শেষে দেখা যায়, তবে সবচেয়ে সহজ উপায় হ'ল 'প্রতিস্থাপন' ব্যবহার করা:

url = 'abcdc.com'
print(url.replace('.com',''))

56
এটিও ইউআরএলটির মতো প্রতিস্থাপন করবে www.computerhope.com। সাথে একটি চেক করুন endswith()এবং ভাল হতে হবে।
ghostdog74

72
"www.computerhope.com".endswith(".com")সত্য, এটি এখনও ভাঙ্গবে!

1
"আপনি যদি নিশ্চিত হন যে স্ট্রিংটি কেবল শেষে প্রদর্শিত হবে" আপনার অর্থ কি "আপনি যদি নিশ্চিত হন যে কেবল স্ট্রিংটি কেবল একবার প্রদর্শিত হবে"? প্রতিস্থাপনটি মধ্যবর্তী স্থানে থাকা অবস্থায়ও কাজ করবে বলে মনে হয়, তবে অন্য মতামত অনুসারে এটি স্ট্রিংয়ের কোনও ঘটনা প্রতিস্থাপন করবে, কেন এটি শেষে হওয়া উচিত আমি বুঝতে চাই না
idclev 463035818

49
def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]

4
যদি আপনি জানেন যে প্রত্যয়টি খালি নয় (যেমন এটি যখন ধ্রুবক থাকে) তবে: পাঠ্য পাঠ্য [: - লেন (প্রত্যয়)]
মার্চ এইচ

4
ধন্যবাদ। শেষ লাইনটি ছোট করা যেতে পারে:return text[:-len(suffix)]
যাবা

3
@ জাবা: দুঃখের বিষয়, ফুয়েনফুন্ডচ্যাটজিগের মতো এটি খালি প্রত্যয়গুলির জন্য কাজ করবে না।
ইয়ারচু

46

যেহেতু মনে হচ্ছে এখনও কেউ এটিকে নির্দেশ করেনি:

url = "www.example.com"
new_url = url[:url.rfind(".")]

split()কোনও নতুন তালিকা অবজেক্ট তৈরি না হওয়ায় এটি ব্যবহারের পদ্ধতিগুলির চেয়ে আরও দক্ষ হওয়া উচিত এবং এই দ্রবণটি বেশ কয়েকটি বিন্দুর সাথে স্ট্রিংয়ের জন্য কাজ করে।


বাহ যে দুর্দান্ত কৌশল। আমি এটি ব্যর্থ হতে পারি না তবে এটি ব্যর্থ হতে পারে এমন উপায়গুলি চিন্তা করতে সক্ষম হতে আমারও খুব কষ্ট হয়েছিল। আমি এটি পছন্দ করি তবে এটি খুব "icalন্দ্রজালিক", এটি কেবল কী দেখে তা জানা শক্ত hard "এটি পেতে" আমাকে লাইনের প্রতিটি অংশ মানসিকভাবে প্রসেস করতে হয়েছিল।
দেবপ্লেয়ার

14
অনুসন্ধান করা স্ট্রিং উপস্থিত না থাকলে এটি ব্যর্থ হয় এবং এটি ভুলভাবে পরিবর্তে শেষ অক্ষরটি সরিয়ে দেয়।
robbat2

25

আপনার ইউআরএল সম্পর্কে আপনি কী জানেন এবং ঠিক কী করার চেষ্টা করছেন তার উপর নির্ভর করে। যদি আপনি জানেন যে এটি সর্বদা '.com' (বা '। নেট' বা '.org') এ শেষ হবে

 url=url[:-4]

দ্রুততম সমাধান। যদি এটি আরও সাধারণ ইউআরএল হয় তবে অজগর নিয়ে আসা urlparse গ্রন্থাগারটি সন্ধান করা আপনি আরও ভাল।

আপনি অন্যদিকে যদি আপনি কেবল ফাইনালের পরে সবকিছু মুছে ফেলতে চান ''। একটি স্ট্রিং তারপর

url.rsplit('.',1)[0]

কাজ করবে. অথবা আপনি যদি চান তবে প্রথমে কিছু চান ''। তারপরে চেষ্টা করুন

url.split('.',1)[0]

16

যদি আপনি জানেন তবে এটি একটি এক্সটেনশান, তবে

url = 'abcdc.com'
...
url.rsplit('.', 1)[0]  # split at '.', starting from the right, maximum 1 split

এই সঙ্গে সমানভাবে ভাল কাজ করে abcdc.comবা www.abcdc.comঅথবা abcdc.[anything]এবং আরো প্রসার্য হয়।




7

ইউআরএলগুলির জন্য (যেমনটি প্রদত্ত উদাহরণের দ্বারা বিষয়টির একটি অংশ বলে মনে হচ্ছে), কেউ এর মতো কিছু করতে পারে:

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", বা নির্দিষ্ট কিছু বিভক্ত করতে হয় তবে এটির সাথেও মিলিত হতে পারে ।


5

url.rsplit ('। com', 1)

বেশ সঠিক নয়।

আপনার যা লিখতে হবে তা হ'ল

url.rsplit('.com', 1)[0]

, এবং এটি দেখতে বেশ সংক্ষিপ্ত আইএমএইচও।

তবে, আমার ব্যক্তিগত পছন্দটি এই বিকল্প কারণ এটি কেবলমাত্র একটি প্যারামিটার ব্যবহার করে:

url.rpartition('.com')[0]

1
যখনই সর্বদা একটি উত্তর দেয় কেবলমাত্র একটি বিভাজন প্রয়োজন তখন +1 পার্টিশনটি অগ্রাধিকার দেওয়া হয়, একটি সূচিপত্র দেখা যায় না।
গ্রিংগো সুভেভ


2

আপনার যদি কোনও স্ট্রিংয়ের কিছু প্রান্ত উপস্থিত থাকে তবে তা অন্যথায় কিছু করবেন না। আমার সেরা সমাধান। আপনি সম্ভবত প্রথম 2 টি প্রয়োগের একটি ব্যবহার করতে চাইবেন তবে আমি সম্পূর্ণতার জন্য তৃতীয়টি অন্তর্ভুক্ত করেছি।

ধ্রুব প্রত্যয় জন্য:

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"

ধ্রুবক প্রত্যয় সংগ্রহের জন্য বিপুল সংখ্যক কলগুলির জন্য asyptotically দ্রুততম উপায়:

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')

চূড়ান্ত একটি সম্ভবত পাইপিতে সিপাইথনে উল্লেখযোগ্যভাবে দ্রুত। কার্যত সমস্ত ক্ষেত্রেই রেজেক্স বৈকল্পিক সম্ভবত এর চেয়ে দ্রুততর হতে পারে যে কমপক্ষে সিপাইথনে রিজেক্স হিসাবে সহজেই প্রতিনিধিত্ব করা যায় না এমন সম্ভাব্য প্রত্যয়গুলির বৃহত অভিধানগুলি জড়িত না করে।

পিআইপি-তে রিজেক্স ভেরিয়েন্টটি অবশ্যই বৃহত সংখ্যক কল বা লম্বা স্ট্রিংয়ের জন্য প্রায় ধীরে ধীরে ধীরে ধীরে ধীরে module

সিপাইথনে তবে সত্য যে আপনার রেগেক্সের জন্য চলমান সি কোডটি প্রায় সমস্ত ক্ষেত্রেই প্রত্যয় সংগ্রহ সংস্করণটির অ্যালগরিদমিক সুবিধার সাথে প্রায় অবশ্যই উপায়গুলির তুলনা করে।


2

যদি আপনি কেবল এক্সটেনশানটি ছড়িয়ে দিতে চান:

'.'.join('abcdc.com'.split('.')[:-1])
# 'abcdc'

এটি ফাইলের নামটিতে থাকা সম্ভাব্য অন্যান্য বিন্দুগুলির সাথে কোনও বর্ধনের সাথে কাজ করে। এটি কেবল বিন্দুগুলির তালিকা হিসাবে স্ট্রিংকে বিভক্ত করে এবং শেষ উপাদান ছাড়াই এটিতে যোগ দেয়।


2
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)

তবে সিপিইউ যদি বোতল ঘাড় হয় তবে পাইথনে কেন লিখবেন?

সিপিইউ কখন কীভাবে বোতল ঘাড় হয়? ড্রাইভারদের মধ্যে, সম্ভবত।

নিয়মিত এক্সপ্রেশন ব্যবহারের সুবিধাগুলি হ'ল কোড পুনরায় ব্যবহারযোগ্যতা। আপনি যদি পরবর্তী '.me' অপসারণ করতে চান তবে এর মধ্যে কেবল তিনটি অক্ষর রয়েছে?

একই কোডটি কৌশলটি করবে:

>>> rm_sub('abcdc.me','.me')
'abcdc'

1

আমার ক্ষেত্রে আমার একটি ব্যতিক্রম বাড়াতে হবে তাই আমি করেছি:

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)]


1

ধরে নিচ্ছি আপনি ডোমেনটি মুছে ফেলতে চান, তা যাই হোক না কেন (.কম,। নেট ইত্যাদি)। আমি .সেই জায়গা থেকে সবকিছু সন্ধান এবং অপসারণের পরামর্শ দিচ্ছি ।

url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]

এখানে আমি rfindurl এর সমস্যার সমাধান করতে ব্যবহার করছি abcdc.com.netযা নামটি কমিয়ে দেওয়া উচিত abcdc.com

আপনি যদি এর জন্যও উদ্বিগ্ন হন তবে আপনার www.স্পষ্টভাবে তাদের জন্য পরীক্ষা করা উচিত:

if url.startswith("www."):
   url = url.replace("www.","", 1)

প্রতিস্থাপনে থাকা 1টি অদ্ভুত প্রান্তক্যাসগুলির মতো www.net.www.com

আপনার ইউআরএল যদি এর চেয়ে আরও বুদ্ধিমান হয়ে থাকে তবে লোকেদের প্রতিক্রিয়া জানায় রেগেক্স উত্তরগুলি।


1

আমি অন্তর্নির্মিত স্ট্রিপ ফাংশনটি এটি অনুসরণ করার মতো করতে ব্যবহার করেছি:

string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test

খারাপ ধারণা। ব্যবহার করে দেখুন "test.ccom"
শীতল শাহ

তবে এটি প্রশ্নের মূল বিষয় নয়। এটি কেবল অন্যের প্রান্ত থেকে একটি পরিচিত সাবস্ট্রিং সরাতে বলা হয়েছিল। এটি প্রত্যাশার মতো ঠিক কাজ করে।
অ্যালেক্স

1

আপনি বিভক্ত ব্যবহার করতে পারেন:

'abccomputer.com'.split('.com',1)[0]
# 'abccomputer'

5
যখন a = 'www.computerbugs.com'এই ফলাফলটি 'www'
ইয়ারচু

0

এটি নিয়মিত প্রকাশের জন্য একটি নিখুঁত ব্যবহার:

>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'

5
".Com" এ শেষ হওয়া হোস্টনামের সাথে আপনার মিল রয়েছে তা নিশ্চিত করতে আপনারও একটি $ যুক্ত করা উচিত ।
ক্রিশ্চিয়ান সিউপিতু

0

পাইথন> = 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')

1
পাইথন ৩.৯-এর জন্য আপনার উত্তর উপরের এই উত্তরটির সদৃশ । পূর্ববর্তী সংস্করণগুলির জন্য আপনার উত্তরটিও এই থ্রেডে অনেকবার উত্তর দেওয়া হয়েছে এবং স্ট্রিংটির প্রত্যয় না থাকলে কোনও কিছুই ফেরত পাবেন না।
জাভেয়ের গুইহট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.