কেস সংবেদনশীল প্রতিস্থাপন


উত্তর:


217

stringটাইপ এই সমর্থন করে না। আপনি সম্ভবত ব্যবহার বন্ধ ভাল আছেন রেগুলার এক্সপ্রেশন সাব পদ্ধতি সঙ্গে re.IGNORECASE বিকল্প।

>>> import re
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE)
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday')
'I want a giraffe for my birthday'

11
আপনি যদি কেবল একটি একক প্রতিস্থাপন করছেন, বা কোডের লাইনগুলি সংরক্ষণ করতে চান তবে re.sub এবং (? I) পতাকা সহ একটি একক প্রতিস্থাপন ব্যবহার করা আরও দক্ষ efficient re.sub ('(? I)' + re .escape ('হিপ্পো'), 'জিরাফ', 'আমি আমার জন্মদিনের জন্য একটি হিপপো চাই')
ডি কোটজি

3
কেবল অক্ষরের একটি স্ট্রিংয়ের জন্য কেন পুনরায় পরীক্ষা করুন? ধন্যবাদ।
এলেনা

8
@ এলেনা, এটির জন্য প্রয়োজন হয় না 'hippo', তবে কার্যকর হবে যদি প্রতিস্থাপনের মানটি কোনও ফাংশনে স্থানান্তরিত হয়, তাই এটি অন্য যে কোনও কিছুর চেয়ে সত্যিই আরও ভাল উদাহরণ।
ব্লেয়ার কনরাড

2
করা ছাড়াও re.escapeআপনার সুই, এখানে অন্য ফাঁদ যা এই উত্তর এড়াতে ব্যর্থ হয়, উল্লেখ করেন stackoverflow.com/a/15831118/1709587 : যেহেতু re.subপ্রসেস সিকোয়েন্স অব্যাহতি, যেমন উল্লেখ করা docs.python.org/library/re.html#re .সুব , আপনার হয় প্রতিস্থাপনের স্ট্রিংয়ের সমস্ত ব্যাকস্ল্যাশগুলি থেকে বাঁচতে হবে বা ল্যাম্বডা ব্যবহার করতে হবে।
মার্ক আমেরিকা

84
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'

17
বা ওয়ান-লাইনার: re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
লুই ইয়াং

নোট করুন যে re.subপাইথন ২.7 থেকে কেবল এই পতাকাটিকে সমর্থন করে।
fuenfundachtzig

47

একক লাইনে:

import re
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye'
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye'

অথবা, "চ্ছিক "পতাকা" যুক্তি ব্যবহার করুন:

import re
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye'
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye'

14

বিফ্লোকের উত্তর অব্যাহত রেখে, এই ফাংশনটি একটি নয়, তবে পুরানো সমস্ত ঘটনাকেই সংবেদনশীল ফ্যাশনে পরিবর্তন করবে।

def ireplace(old, new, text):
    idx = 0
    while idx < len(text):
        index_l = text.lower().find(old.lower(), idx)
        if index_l == -1:
            return text
        text = text[:index_l] + new + text[index_l + len(old):]
        idx = index_l + len(new) 
    return text

অনেক ভালো করেছ. রেজেক্সের চেয়ে অনেক বেশি ভাল; এটি সমস্ত ধরণের অক্ষর পরিচালনা করে, অন্যদিকে রেজিেক্স অ-অক্ষর সংক্রান্ত কিছু সম্পর্কে খুব উদ্বেগজনক। পছন্দসই উত্তর আইএমএইচও।
fyngyrz

আপনাকে যা করতে হবে তা সমস্তই রেজেক্স থেকে বাঁচতে হবে: গৃহীত উত্তরগুলি এর চেয়ে কম খাটো এবং সহজেই পড়া সহজ।
ম্যাড পদার্থবিজ্ঞানী

এস্কেপ কেবল মিলের জন্য কাজ করে, গন্তব্যটিতে ব্যাকস্ল্যাশগুলি জিনিসগুলিকে বিশৃঙ্খলা করতে পারে।
ধারণাগুলি 42

4

ব্লেয়ার কনরাডের মতো স্ট্রিং.রেপ্লেস এটি সমর্থন করে না।

রেজেক্স ব্যবহার করুন re.subতবে প্রথমে প্রতিস্থাপনের স্ট্রিংটি থেকে বাঁচতে ভুলবেন না। মনে রাখবেন যে ২.6 এর জন্য কোনও ফ্ল্যাগ-বিকল্প নেই re.sub, সুতরাং আপনাকে এমবেডেড মডিফায়ার ব্যবহার করতে হবে '(?i)'(বা একটি আরই-অবজেক্ট, ব্লেয়ার কনরাডের উত্তর দেখুন)। এছাড়াও, আরেকটি ক্ষতি হ'ল সাবটি প্রতিস্থাপন পাঠ্যে ব্যাকস্ল্যাশ পলায়নের প্রক্রিয়া করবে, যদি কোনও স্ট্রিং দেওয়া হয়। এটি এড়াতে পরিবর্তে একটি ল্যাম্বডায় যেতে পারে।

এখানে একটি ফাংশন:

import re
def ireplace(old, repl, text):
    return re.sub('(?i)'+re.escape(old), lambda m: repl, text)

>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?')
'You want a giraffe!?'
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe')
'C:\\Temp\\bin\\test.exe'

4

এই ফাংশনটি উভয় ব্যবহার str.replace()এবং re.findall()ফাংশন। এটা সব occurences প্রতিস্থাপন করবে patternমধ্যে stringদিয়ে replএকটি কেস-অবশ উপায়।

def replace_all(pattern, repl, string) -> str:
   occurences = re.findall(pattern, string, re.IGNORECASE)
   for occurence in occurences:
       string = string.replace(occurence, repl)
       return string

3

এর জন্য রেগুলারএক্সপ প্রয়োজন হয় না

def ireplace(old, new, text):
    """ 
    Replace case insensitive
    Raises ValueError if string not found
    """
    index_l = text.lower().index(old.lower())
    return text[:index_l] + new + text[index_l + len(old):] 

3
ভাল, তবে এটি পুরানো সমস্ত ঘটনাকে নতুন দিয়ে পরিবর্তন করে না, তবে কেবল প্রথম ঘটনা।
আরএসমোর্থি

5
এটি রেগেক্স সংস্করণটির চেয়ে কম পঠনযোগ্য। এখানে চাকা পুনর্বিবেচনার প্রয়োজন নেই।
জোহানেস বিট্টনার 30'11

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

2

বাক্য গঠন বিশদ এবং বিকল্পগুলি সম্পর্কে একটি আকর্ষণীয় পর্যবেক্ষণ:

পাইথন ৩.7.২ (ট্যাগগুলি / v3.7.2: 9a3ffc0492, ডিসেম্বর 23 2018, 23:09:28) [এমএসসি v.1916 64 বিট (এএমডি 64)] উইন 32

import re
old = "TREEROOT treeroot TREerOot"
re.sub(r'(?i)treeroot', 'grassroot', old)

'তৃণমূল তৃণমূল তৃণমূল'

re.sub(r'treeroot', 'grassroot', old)

'তৃণমূল তৃণমূল ট্রেআরআউট'

re.sub(r'treeroot', 'grassroot', old, flags=re.I)

'তৃণমূল তৃণমূল তৃণমূল'

re.sub(r'treeroot', 'grassroot', old, re.I)

'তৃণমূল তৃণমূল ট্রেআরআউট'

সুতরাং ম্যাচের এক্সপ্রেশনটিতে (? I) উপসর্গ বা চতুর্থ যুক্তি হিসাবে "পতাকাগুলি = পুনরায় আইআই" যুক্ত করার ফলে কেস-সংবেদনশীল ম্যাচ হবে। কিন্তু, চতুর্থ যুক্তি হিসাবে কেবল "re.I" ব্যবহার করার ফলে কেস-সংবেদনশীল মিল পাওয়া যায় না।

তুলনার জন্য,

re.findall(r'treeroot', old, re.I)

['ট্রেইরোট', 'ট্রেয়ারুট', 'ট্রেয়ারআউট']

re.findall(r'treeroot', old)

[ 'Treeroot']


এটি প্রশ্নের উত্তর সরবরাহ করে না। দয়া করে সম্পাদনা তা নিশ্চিত করার জন্য এটি অন্যান্য উত্তর ইতিমধ্যেই এই প্রশ্নে বর্তমান উপর উন্নত আপনার উত্তর।
হংসসি

1

আমি পালানোর সিকোয়েন্সগুলিতে রূপান্তরিত হচ্ছিলাম না (কিছুটা নিচে স্ক্রোল করুন), তাই আমি উল্লেখ করেছি যে রি.সুব পালিয়ে যাওয়া চরিত্রগুলিকে সিকোয়েন্সগুলি থেকে পালাতে রূপান্তরিত করে।

এটি রোধ করতে আমি নিম্নলিখিত লিখেছি:

সংবেদনশীল কেস প্রতিস্থাপন।

import re
    def ireplace(findtxt, replacetxt, data):
        return replacetxt.join(  re.compile(findtxt, flags=re.I).split(data)  )

এছাড়াও, আপনি যদি এটিকে এখানে পাল্টানো অক্ষরের সাথে প্রতিস্থাপন করতে চান তবে অন্যান্য উত্তরগুলির মতো এখানেও বিশেষ অর্থ বাশল্যাশ অক্ষরগুলি পালানোর সিকোয়েন্সগুলিতে রূপান্তরিত হচ্ছে, কেবল আপনার সন্ধানটি ডিকোড করুন বা স্ট্রিং প্রতিস্থাপন করুন। পাইথন 3-তে, .ডিকোড ("ইউনিকোড_সেক্যাপ") # অজগর 3 এর মতো কিছু করতে হতে পারে

findtxt = findtxt.decode('string_escape') # python2
replacetxt = replacetxt.decode('string_escape') # python2
data = ireplace(findtxt, replacetxt, data)

পাইথনে ২.7.৮ পরীক্ষিত

আশা করি এইটি কাজ করবে.


0

এর আগে কখনও উত্তর পোস্ট করেনি এবং এই থ্রেডটি আসলেই পুরানো তবে আমি অন্য একতরফা দিয়ে হাজির হয়েছি এবং বুঝতে পেরেছি যে আমি আপনার দায়িত্ব পেতে পারি, পাইথন প্রোগ্রামিংয়ে আমি পাকা না তাই যদি এটির সামনে উপস্থিত কোনও ত্রুটি রয়েছে তবে দয়া করে এটিকে ভাল শিখার পরে উল্লেখ করুন: )

i='I want a hIPpo for my birthday'
key='hippo'
swp='giraffe'

o=(i.lower().split(key))
c=0
p=0
for w in o:
    o[c]=i[p:p+len(w)]
    p=p+len(key+w)
    c+=1
print(swp.join(o))

2
শেখার জন্য: সাধারণত আপনি যখন কোনও অনুসন্ধান করেন এবং স্ট্রিং প্রতিস্থাপন করেন, প্রথমে এটিকে অ্যারেতে পরিণত না করাই ভাল। এজন্য প্রথম উত্তরটি সম্ভবত সেরা। এটি কোনও বাহ্যিক মডিউল ব্যবহার করার সময়, এটি স্ট্রিংটিকে পুরো স্ট্রিং হিসাবে বিবেচনা করে। প্রক্রিয়াটি কী ঘটছে তাও এটি একটু স্পষ্ট।
isaaclw

শেখার জন্য: কোনও প্রসঙ্গবিহীন কোনও বিকাশকারীকে এই কোডটি পড়া এবং এটি কী করছে তা বোঝার পক্ষে খুব কঠিন :)
টড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.