স্ট্রিং এ সাবস্ট্রিংয়ের শেষ ঘটনাটি সন্ধান করে, এটি প্রতিস্থাপন করে


104

সুতরাং একই বিন্যাসে আমার কাছে স্ট্রিংগুলির দীর্ঘ তালিকা রয়েছে এবং আমি সর্বশেষটি খুঁজে পেতে চাই। " প্রত্যেকটির চরিত্র এবং এটিকে "" - "দিয়ে প্রতিস্থাপন করুন। আমি আরফাইন্ড ব্যবহার করার চেষ্টা করেছি, তবে এটি করার জন্য আমি এটি সঠিকভাবে ব্যবহার করতে পারি না বলে মনে হয়।


উত্তর:


163

এটি করা উচিত

old_string = "this is going to have a full stop. some written sstuff!"
k = old_string.rfind(".")
new_string = old_string[:k] + ". - " + old_string[k+1:]

1
অনেক অনেক ধন্যবাদ। এক মিনিটের জন্য অধ্যয়ন করতে যাচ্ছি ... এটি টুকরোগুলি ব্যবহার করছে, তাই না?
আদম মাগাইয়ার

@ অ্যাডামগায়ার হ্যাঁ, ধারক [ক: খ] ধারকটির বি -1 সূচি পর্যন্ত টুকরো টুকরো। যদি 'ক' বাদ দেওয়া হয়, তবে এটি 0 এ ডিফল্ট হয়; যদি 'বি' বাদ দেওয়া হয় তবে এটি ল্যান (ধারক) -এ ডিফল্ট হয়। প্লাস অপারেটর কেবল সম্মতি দেয়। আরফাইন্ড ফাংশনটি আপনি নির্দেশিত হিসাবে সূচকটি প্রতিস্থাপন করে যার চারপাশে প্রতিস্থাপন অপারেশনটি হওয়া উচিত।
আদিত্য সিহাগ

26

ডান থেকে প্রতিস্থাপন করতে:

def replace_right(source, target, replacement, replacements=None):
    return replacement.join(source.rsplit(target, replacements))

ব্যাবহৃত হচ্ছে:

>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'

1
আমি অবশ্যই এই সমাধানটি পছন্দ করি তবে replacements=Noneপ্যারামিটারটি থাকা আমার কাছে একটি ত্রুটি বলে মনে হয় কারণ যদি পরামিতি বাদ দেওয়া হয় তবে ফাংশনটি একটি ত্রুটি দেবে (পাইথন ২.7 এ চেষ্টা করা হয়েছে)। আমি প্রস্তাব দিচ্ছি হয় হয় ডিফল্ট মানটি সরিয়ে ফেলা, এটি -1 এ সেট করুন (সীমাহীন প্রতিস্থাপনের জন্য) বা আরও ভাল করে তুলুন replacements=1(যা আমি মনে করি ওপি যা চায় তার অনুসারে এই নির্দিষ্ট ফাংশনের জন্য ডিফল্ট আচরণ হওয়া উচিত)। দস্তাবেজ অনুসারে এই প্যারামিটারটি .চ্ছিক, তবে যদি দেওয়া হয় তবে এটি অবশ্যই একটি int হবে।
রেমারকভ

যদি কেউ এই জন্য একটি এক-লাইনের চায়: ". -".join("asd.asd.asd.".rsplit(".", 1))। আপনি যা করছেন তা 1 টি ঘটনার জন্য ডান দিক থেকে একটি স্ট্রিং বিভক্ত করছে এবং প্রতিস্থাপনটি ব্যবহার করে আবার স্ট্রিংয়ে যোগ দিচ্ছে।
বিস্ফোরণ

14

আমি একটি রেজেক্স ব্যবহার করব:

import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]

2
এটিই একমাত্র উত্তর যা কোনও বিন্দু না থাকলে কাজ করে। যদিও আমি লুকোচুরি ব্যবহার করব:\.(?=[^.]*$)
জর্জি

6

একটি লাইনার হ'ল:

str=str[::-1].replace(".",".-",1)[::-1]


1
এটা ভুল । আপনি স্ট্রিংটি বিপরীত করছেন, এটি প্রতিস্থাপন করছেন এবং তারপরে এটি আবার ফিরিয়ে দিচ্ছেন। আপনি .replaceএকটি বিপরীত স্ট্রিং করছেন । উভয় স্ট্রিং পাস করে replaceখুব বিপরীত করতে হবে। অন্যথায় আপনি যখন দ্বিতীয়বার স্ট্রিংটি উল্টান তখন আপনার সবেমাত্র সন্নিবেশ করা চিঠিগুলি পিছনের দিকে হবে। আপনি কেবল তখনই এটি ব্যবহার করতে পারেন আপনি যদি একটি চিঠির পরিবর্তে একটি চিঠি প্রতিস্থাপন করেন এবং তারপরেও আমি আপনার কোডটিতে এটি রাখব না কারন ভবিষ্যতে কেউ এটিকে পরিবর্তন করতে পারে এবং ভাবতে শুরু করে যে কোনও শব্দ কেন strawkcab লেখা হয়েছে।
বরিস

1

আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন যা শব্দের প্রথম উপস্থিতিকে ডান থেকে প্রতিস্থাপন করে।

def replace_from_right(text: str, original_text: str, new_text: str) -> str:
    """ Replace first occurrence of original_text by new_text. """
    return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]

0
a = "A long string with a . in the middle ending with ."

# যদি আপনি কোনও স্ট্রিংয়ের শেষ ঘটনাটির সূচকটি খুঁজে পেতে চান, আমাদের ক্ষেত্রে আমরা # এর সাথে শেষ ঘটনাটির সূচকটি খুঁজে পাব

index = a.rfind("with") 

# 0 সূচক 0 থেকে শুরু হওয়ার সাথে সাথে ফলাফল 44 হবে।


-1

সাদামাটা পদ্ধতির:

a = "A long string with a . in the middle ending with ."
fchar = '.'
rchar = '. -'
a[::-1].replace(fchar, rchar[::-1], 1)[::-1]

Out[2]: 'A long string with a . in the middle ending with . -'

একক দিয়ে আদিত্য সিহাগের উত্তর rfind:

pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]

এটি প্রতিস্থাপনের স্ট্রিংটিকেও বিপরীত করে। তা ছাড়া, এটি মূলের উত্তরটির পুনরাবৃত্তি এবং আমি যেমন এখানে বলি, বেশ অদক্ষ।
গ্যারেথ লেটি

@ লাট্টিওয়্যার আপনার মানে কি এটি বিপরীত a?
অ্যালেক্স এল

মানে এটি '. -'আউটপুটে বিপরীত ।
গ্যারেথ লেটি

ব্যবহারকারীর হাতে স্ট্রিংকে আক্ষরিক বিপরীত করা কেবল আশা করা কোনও দুর্দান্ত ধারণা নয় - এটি ভুল এবং অস্পষ্ট হওয়ার ঝুঁকির মধ্যে রয়েছে।
গ্যারেথ লেটি

@ লাট্টিওয়্যার সম্মত আমি এটি একটি ভার বানিয়েছি। (আমি বুঝতে পেরেছি এটি একটি অদক্ষ পদ্ধতি, এবং সব ক্ষেত্রে উপযুক্ত নয় - আপনার replace_rightঅনেক ভাল)
অ্যালেক্স এল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.