স্ট্রিংয়ে অক্ষরের একটি তালিকা সরানো হচ্ছে


217

আমি পাইথনের একটি স্ট্রিংয়ের অক্ষরগুলি মুছতে চাই:

string.replace(',', '').replace("!", '').replace(":", '').replace(";", '')...

তবে আমার অনেকগুলি চরিত্র আমাকে মুছতে হবে। আমি একটি তালিকা সম্পর্কে চিন্তা

list = [',', '!', '.', ';'...]

তবে আমি কীভাবে listঅক্ষরের প্রতিস্থাপন করতে ব্যবহার করতে পারি string?


6
বিভিন্ন সমাধান এবং একটি দুর্দান্ত তুলনা করার জন্য stackoverflow.com/questions/1919096/… দেখুন ।
মার্টিজন ডি মিলিয়ানো

এটি অত্যন্ত দুঃখের বিষয় যে পাইথন (যা ব্যাটারি সহ অন্তর্ভুক্ত রয়েছে বলে মনে হয়) এই ব্যবহারের কেসটি বাক্সের বাইরে পরিচালনা করে না। পিএইচপি-র ফাংশনটি এটি করে - আপনি প্রথম আর্গুমেন্ট হিসাবে একটি অ্যারে এবং দ্বিতীয় হিসাবে একটি স্ট্রিং পাস করতে পারেন ( php.net/manual/pl/function.str-replace.php )।
JustAC0der

উত্তর:


265

যদি আপনি পাইথন 2 ব্যবহার করেন এবং আপনার ইনপুটগুলি স্ট্রিং (ইউনিকোড নয়) হয় তবে একেবারে সেরা পদ্ধতিটি হ'ল str.translate:

>>> chars_to_remove = ['.', '!', '?']
>>> subj = 'A.B!C?'
>>> subj.translate(None, ''.join(chars_to_remove))
'ABC'

অন্যথায়, নিম্নলিখিত বিকল্পগুলি বিবেচনা করার জন্য রয়েছে:

উ: চর দ্বারা বিষয়টির চরিত্রটি চিহ্নিত করুন, অযাচিত অক্ষর এবং joinফলাফলের তালিকা বাদ দিন :

>>> sc = set(chars_to_remove)
>>> ''.join([c for c in subj if c not in sc])
'ABC'

(নোট করুন যে জেনারেটর সংস্করণটি ''.join(c for c ...)কম কার্যকর হবে)।

বি ফ্লাই এবং re.subএকটি খালি স্ট্রিং সহ একটি নিয়মিত প্রকাশ তৈরি করুন :

>>> import re
>>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']'
>>> re.sub(rx, '', subj)
'ABC'

( re.escapeনিশ্চিত করে যে অক্ষরগুলি নিয়মিত অভিব্যক্তি পছন্দ করে ^বা ]না ভঙ্গ করে)।

সি ম্যাপিংয়ের রূপটিtranslate ব্যবহার করুন :

>>> chars_to_remove = [u'δ', u'Γ', u'ж']
>>> subj = u'AжBδCΓ'
>>> dd = {ord(c):None for c in chars_to_remove}
>>> subj.translate(dd)
u'ABC'

সম্পূর্ণ পরীক্ষার কোড এবং সময়:

#coding=utf8

import re

def remove_chars_iter(subj, chars):
    sc = set(chars)
    return ''.join([c for c in subj if c not in sc])

def remove_chars_re(subj, chars):
    return re.sub('[' + re.escape(''.join(chars)) + ']', '', subj)

def remove_chars_re_unicode(subj, chars):
    return re.sub(u'(?u)[' + re.escape(''.join(chars)) + ']', '', subj)

def remove_chars_translate_bytes(subj, chars):
    return subj.translate(None, ''.join(chars))

def remove_chars_translate_unicode(subj, chars):
    d = {ord(c):None for c in chars}
    return subj.translate(d)

import timeit, sys

def profile(f):
    assert f(subj, chars_to_remove) == test
    t = timeit.timeit(lambda: f(subj, chars_to_remove), number=1000)
    print ('{0:.3f} {1}'.format(t, f.__name__))

print (sys.version)
PYTHON2 = sys.version_info[0] == 2

print ('\n"plain" string:\n')

chars_to_remove = ['.', '!', '?']
subj = 'A.B!C?' * 1000
test = 'ABC' * 1000

profile(remove_chars_iter)
profile(remove_chars_re)

if PYTHON2:
    profile(remove_chars_translate_bytes)
else:
    profile(remove_chars_translate_unicode)

print ('\nunicode string:\n')

if PYTHON2:
    chars_to_remove = [u'δ', u'Γ', u'ж']
    subj = u'AжBδCΓ'
else:
    chars_to_remove = ['δ', 'Γ', 'ж']
    subj = 'AжBδCΓ'

subj = subj * 1000
test = 'ABC' * 1000

profile(remove_chars_iter)

if PYTHON2:
    profile(remove_chars_re_unicode)
else:
    profile(remove_chars_re)

profile(remove_chars_translate_unicode)

ফলাফল:

2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]

"plain" string:

0.637 remove_chars_iter
0.649 remove_chars_re
0.010 remove_chars_translate_bytes

unicode string:

0.866 remove_chars_iter
0.680 remove_chars_re_unicode
1.373 remove_chars_translate_unicode

---

3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]

"plain" string:

0.512 remove_chars_iter
0.574 remove_chars_re
0.765 remove_chars_translate_unicode

unicode string:

0.817 remove_chars_iter
0.686 remove_chars_re
0.876 remove_chars_translate_unicode

(পার্শ্ব নোট হিসাবে, চিত্রটি remove_chars_translate_bytesআমাদের একটি সূত্র দিতে পারে যে কেন এত দীর্ঘ সময় ধরে ইউনিকোড গ্রহণ করতে শিল্প অনীহা প্রকাশ করেছিল)।


1
দ্বিতীয় পদ্ধতিটি একটি ত্রুটি উত্থাপন করে TypeError: translate() takes exactly one argument (2 given)। স্পষ্টতই এটি একটি যুক্তি হিসাবে ডিক লাগে।
অ্যান্টনেভি

@ অ্যান্টনোভি - দ্বিতীয় সমাধানটি কাজ করে - তবে কেবল স্ট্রিংটি ইউনিকোড নয় (যার জন্য আলাদা অনুবাদ () প্রয়োজন)
ফুজিআমি

112

আপনি ব্যবহার করতে পারেন str.translate():

s.translate(None, ",!.;")

উদাহরণ:

>>> s = "asjo,fdjk;djaso,oio!kod.kjods;dkps"
>>> s.translate(None, ",!.;")
'asjofdjkdjasooiokodkjodsdkps'

19
@ thg435: কেউ এই জন্য বলা, কিন্তু যাহাই হউক না কেন:s.translate(dict.fromkeys(map(ord, u",!.;")))
সেভেন Marnach

2
এটি (এবং @ প্রবীণগোলকোটার) যুগপত উত্তর ঠিক হ'ল @ লরা যা চেয়েছিলেন এবং পছন্দসই উত্তর হতে হবে।
hobs

7
পাইথন 3: টাইপ এরির: ট্রান্সলেট () ঠিক একটি যুক্তি নেয় (2 দেওয়া)
গাঙ্ক

2
@ গ্যাঙ্ক: unicode.translate()পদ্ধতিটির চেয়ে str.translate()পদ্ধতির আলাদা পরামিতি রয়েছে । ইউনিকোড অবজেক্টের জন্য উপরের মন্তব্যে ভেরিয়েন্টটি ব্যবহার করুন।
সোভেন মারনাচ

@ সোভেনমার্নচ মানচিত্র কী (অর্ড, ইউ ",!।;"))? এবং আপনি কি ইউনিকোডের পক্ষে দাঁড়িয়েছেন?
711


16
''.join(c for c in myString if not c in badTokens)

চর এবং স্ট্রিং +1 এর ভিত্তিতে নয় - অনুরূপ ক্ষেত্রে কার্যকর
ওল্ফ

12

আপনি যদি পাইথন 3 ব্যবহার করছেন এবং translateসমাধানটি সন্ধান করছেন - ফাংশনটি পরিবর্তন করা হয়েছিল এবং এখন 2 এর পরিবর্তে 1 পরামিতি লাগে।

সেই প্যারামিটারটি একটি সারণী (অভিধান হতে পারে) যেখানে প্রতিটি কী অক্ষরটির ইউনিকোড অর্ডিনাল (ইনট) সন্ধান করতে হয় এবং মানটি প্রতিস্থাপন হয় (কোনও ইউনিকোড অর্ডিনাল বা কীটির মানচিত্রের স্ট্রিং হতে পারে)।

এখানে ব্যবহারের উদাহরণ দেওয়া হল:

>>> list = [',', '!', '.', ';']
>>> s = "This is, my! str,ing."
>>> s.translate({ord(x): '' for x in list})
'This is my string'


7

সরল লুপ কেন নয়?

for i in replace_list:
    string = string.replace(i, '')

এছাড়াও, তালিকা 'তালিকা' নামকরণ এড়ানো। এটি বিল্ট-ইন ফাংশনটিকে ওভাররাইড করে list


6

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

def replace_all(text, dic):
  for i, j in dic.iteritems():
    text = text.replace(i, j)
  return text

এই কোড আমার নিজের নয় এবং থেকে আসে এখানে এই কাজ গভীরতা তার একটি মহান নিবন্ধ এবং dicusses


3

এছাড়াও ইউটিএফ -8 উচ্চারণ সরানোর বিষয়ে একটি আকর্ষণীয় বিষয় তাদের স্ট্যান্ডার্ড অ-অ্যাকসেন্টিউটেড চরে রূপান্তরকারী চর গঠন করে:

পাইথন ইউনিকোড স্ট্রিংয়ে অ্যাকসেন্টগুলি সরানোর সর্বোত্তম উপায় কী?

বিষয় থেকে কোড এক্সট্রাক্ট:

import unicodedata

def remove_accents(input_str):
    nkfd_form = unicodedata.normalize('NFKD', input_str)
    return u"".join([c for c in nkfd_form if not unicodedata.combining(c)])

3

আপনি যা চান তা অর্জনের জন্য সম্ভবত আরও আধুনিক ও কার্যকরী উপায়:

>>> subj = 'A.B!C?'
>>> list = set([',', '!', '.', ';', '?'])
>>> filter(lambda x: x not in list, subj)
'ABC'

দয়া করে মনে রাখবেন যে এই নির্দিষ্ট উদ্দেশ্যে এটি বেশ ওভারকিল, তবে একবার আপনার আরও জটিল অবস্থার প্রয়োজন হলে ফিল্টারটি কার্যকর হয়


এছাড়াও মনে রাখবেন যে তালিকা বোধগম্যতার সাথে এটি সহজেই করা যেতে পারে, এটি আমার মতে আরও বেশি পাইথোনিক।
দাঙ্গা করা হয়েছে

3

সহজ উপায়,

import re
str = 'this is string !    >><< (foo---> bar) @-tuna-#   sandwich-%-is-$-* good'

// condense multiple empty spaces into 1
str = ' '.join(str.split()

// replace empty space with dash
str = str.replace(" ","-")

// take out any char that matches regex
str = re.sub('[!@#$%^&*()_+<>]', '', str)

আউটপুট:

this-is-string--foo----bar--tuna---sandwich--is---good



1

আমি মনে করি এটি যথেষ্ট সহজ এবং করবে!

list = [",",",","!",";",":"] #the list goes on.....

theString = "dlkaj;lkdjf'adklfaj;lsd'fa'dfj;alkdjf" #is an example string;
newString="" #the unwanted character free string
for i in range(len(TheString)):
    if theString[i] in list:
        newString += "" #concatenate an empty string.
    else:
        newString += theString[i]

এটি এটি করার এক উপায়। আপনি যদি মুছে ফেলতে চান এমন অক্ষরের একটি তালিকা রেখে যদি আপনি ক্লান্ত হয়ে থাকেন তবে আপনি যে স্ট্রিংগুলির মাধ্যমে পুনরাবৃত্তি করতে চান তার ক্রম সংখ্যাটি ব্যবহার করে আপনি এটি করতে পারেন। ক্রম সংখ্যাটি হ'ল অক্ষরের আস্কি মান। চরের হিসাবে 0 এর জন্য ascii সংখ্যা 48 এবং লোয়ার কেস z এর জন্য আসকি নম্বর 122 তাই:

theString = "lkdsjf;alkd8a'asdjf;lkaheoialkdjf;ad"
newString = ""
for i in range(len(theString)):
     if ord(theString[i]) < 48 or ord(theString[i]) > 122: #ord() => ascii num.
         newString += ""
     else:
        newString += theString[i]

0

এই দিনগুলিতে আমি স্কিমটিতে ডুব দিচ্ছি, এবং এখন আমার মনে হয় পুনরাবৃত্তি করা এবং কার্যকর হওয়া ভাল। Hahaha। কিছু নতুন উপায় ভাগ করুন:

প্রথমে, এটি ব্যাখ্যা করুন

print eval('string%s' % (''.join(['.replace("%s","")'%i for i in replace_list])))

দ্বিতীয়ত, এটি পুনরাবৃত্তি

def repn(string,replace_list):
    if replace_list==[]:
        return string
    else:
        return repn(string.replace(replace_list.pop(),""),replace_list)

print repn(string,replace_list)

আরে, ভাবেনা। আমি কেবল কিছু নতুন ধারণা ভাগ করতে চাই।


0

আমি এর জন্য একটি সমাধান সম্পর্কে ভাবছি। প্রথমে আমি তালিকা হিসাবে স্ট্রিং ইনপুট তৈরি করব। তারপরে আমি তালিকার আইটেমগুলি প্রতিস্থাপন করব। তারপরে join কমান্ড ব্যবহারের মাধ্যমে আমি স্ট্রিং হিসাবে তালিকাটি ফিরিয়ে দেব। কোডটি এর মতো হতে পারে:

def the_replacer(text):
    test = []    
    for m in range(len(text)):
        test.append(text[m])
        if test[m]==','\
        or test[m]=='!'\
        or test[m]=='.'\
        or test[m]=='\''\
        or test[m]==';':
    #....
            test[n]=''
    return ''.join(test)

এটি স্ট্রিং থেকে কিছু সরিয়ে ফেলবে। তুমি এটা সম্পর্কে কী ভাব?


0

এখানে একটি more_itertoolsপদ্ধতি:

import more_itertools as mit


s = "A.B!C?D_E@F#"
blacklist = ".!?_@#"

"".join(mit.flatten(mit.split_at(s, pred=lambda x: x in set(blacklist))))
# 'ABCDEF'

এখানে আমরা প্রাপ্ত আইটেমগুলির উপর বিভক্ত হয়েছি blacklist, ফলাফলগুলি সমতল করব এবং স্ট্রিংয়ে যোগ দেব।


0

পাইথন 3, একক লাইন তালিকা অনুধাবন বাস্তবায়ন।

from string import ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
def remove_chars(input_string, removable):
  return ''.join([_ for _ in input_string if _ not in removable])

print(remove_chars(input_string="Stack Overflow", removable=ascii_lowercase))
>>> 'S O'

0

অপসারণ *%,&@! নীচে স্ট্রিং থেকে:

s = "this is my string,  and i will * remove * these ** %% "
new_string = s.translate(s.maketrans('','','*%,&@!'))
print(new_string)

# output: this is my string  and i will  remove  these  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.