পাইথনের একটি স্ট্রিং থেকে নির্দিষ্ট অক্ষর সরিয়ে ফেলুন


545

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

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

আমি কীভাবে এটি সঠিকভাবে করব?


23
5 বছর ধরে হয়েছে, কিন্তু কীভাবে ব্যবহার filterফাংশন এবং একটি ল্যামডা এক্সপ্রেশন: filter(lambda ch: ch not in " ?.!/;:", line)। খুব সংক্ষিপ্ত এবং দক্ষ, আমি মনে করি। অবশ্যই, এটি একটি নতুন স্ট্রিং দেয় যা আপনাকে একটি নাম নির্ধারণ করতে হবে।
জন রেড

3
@ জনরেড: আসলে এটি একটি পুনরাবৃত্তিকে ফিরিয়ে দেয় যা অক্ষরের একটি তালিকা দেয় তবে আপনি যদি এটির উত্তরটি রাখেন তবে আমাদের মধ্যে কয়েকজন এটির ভোট দিয়ে খুশি হবে।
বিল বেল


@ বিলবেল: পিএস: এটি পাইথন 3 এ পুনরাবৃত্তিকারী এবং পাইথন 2-এ একটি স্ট্রিং, টিপল, বা তালিকা
সার্ভ-ইনক

উত্তর:


624

পাইথন মধ্যে Strings হয় অপরিবর্তনীয় (পরিবর্তন করা যাবে না)। এ কারণে, এর প্রভাবটি line.replace(...)পুরানোটি পরিবর্তনের পরিবর্তে কেবল একটি নতুন স্ট্রিং তৈরি করা। সেই ভেরিয়েবলটি নতুন মানটি গ্রহণ করার জন্য আপনাকে এটিকে পুনরায় ফিরিয়ে আনতে হবে (বরাদ্দ করতে হবে) lineসেই অক্ষরগুলি সরিয়ে দিয়ে।

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

পাইথন ২.6 এবং নতুন পাইথন ২.x সংস্করণ * থেকে শুরু করে আপনি এর পরিবর্তে ব্যবহার করতে পারেন str.translate(তবে পাইথন 3 পার্থক্যের জন্য পড়ুন):

line = line.translate(None, '!@#$')

বা নিয়মিত এক্সপ্রেশন প্রতিস্থাপন সঙ্গে re.sub

import re
line = re.sub('[!@#$]', '', line)

বন্ধনীগুলিতে আবদ্ধ অক্ষরগুলি একটি অক্ষর শ্রেণি গঠন করেlineClass শ্রেণিতে থাকা কোনও অক্ষর দ্বিতীয় প্যারামিটারের সাথে প্রতিস্থাপিত হয় sub: একটি খালি স্ট্রিং।

পাইথন 3-এ স্ট্রিংগুলি ইউনিকোড। আপনাকে কিছুটা আলাদাভাবে অনুবাদ করতে হবে। কেভপি উত্তরগুলির একটিতে একটি মন্তব্যে এটি উল্লেখ করেছে এবং এর জন্য ডকুমেন্টেশনেstr.translate এটি উল্লেখ করা হয়েছে ।

translateইউনিকোড স্ট্রিংয়ের পদ্ধতিটি কল করার সময় , আমরা উপরে যে প্যারামিটারটি ব্যবহার করেছি তা পাস করতে পারবেন না। আপনি Noneপ্রথম প্যারামিটার হিসাবে পাস করতে পারবেন না । পরিবর্তে, আপনি একমাত্র পরামিতি হিসাবে অনুবাদ টেবিল (সাধারণত একটি অভিধান) পাস করেন। এই সারণীটি অক্ষরগুলির অর্ডিনাল মানগুলি (যেমন ordতাদেরকে আহ্বানের ফলাফল ) যে অক্ষরগুলির প্রতিস্থাপন করা উচিত, বা তাদের Noneজন্য মুছে ফেলা উচিত indicate " কার্যকরভাবে আমাদের কাছে -" নির্দেশ করে maps

সুতরাং ইউনিকোড স্ট্রিং সহ উপরের নৃত্যটি করতে আপনি এমন কিছু কল করবেন

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

এখানে dict.fromkeysএবং mapসংক্ষিপ্তভাবে একটি অভিধান সম্বলিত অভিধান তৈরি করতে ব্যবহৃত হয়

{ord('!'): None, ord('@'): None, ...}

এমনকি সহজ, অন্য উত্তর যেমনটি বলেছে তেমন জায়গায় অনুবাদ টেবিলটি তৈরি করুন:

unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

অথবা এর সাথে একই অনুবাদ টেবিলটি তৈরি করুন str.maketrans:

unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))

* পূর্ববর্তী পাইথনগুলির সাথে সামঞ্জস্যের জন্য আপনি "নাল" অনুবাদ সারণীটি এর স্থলে পাস করতে পারেন None:

import string
line = line.translate(string.maketrans('', ''), '!@#$')

এখানে string.maketransএকটি অনুবাদ টেবিল তৈরি করতে ব্যবহৃত হয় , যা কেবলমাত্র একটি স্ট্রিং যেখানে অরডিনাল মান 0 থেকে 255 পর্যন্ত অক্ষর থাকে।


26
পাইথন 3-তে, line.translateকেবল একটি যুক্তি লাগে এবং প্রথম সমাধানটি কার্যকর হবে না
মার্কসয়েড

33
পাইথন 3-এ, str.translate () 2 য় আর্গুমেন্ট গ্রহণ করে না। সুতরাং, আপনার উত্তর হয়ে যাবে line.translate({ord(i):None for i in '!@#$'})
নবীন

1
অন্য কোনও চরিত্রের মতোই। পাইথন আপনাকে একক বা ডাবল উদ্ধৃতিগুলির জোড়া ব্যবহার করতে দেয়। সুতরাং আপনি শুধু "'"চরিত্র সেট জন্য লিখুন ।
intuited

2
@ নবীর মন্তব্য আমার পক্ষে কাজ করেছে। পাইথনি 2.7.13। আমার ক্ষেত্রে আমি "এবং 'চরিত্রগুলি notes = notes.translate({ord(i):None for i in '\"\''})
ফ্রি

1
পাইথন 3 এ, আপনি ব্যবহার করতে পারেন unicode_line.translate(str.maketrans('', '', '!@#$'))। অথবাunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Martijn Pieters

234

আমি কি এখানে বিন্দুটি অনুপস্থিত, বা এটি কেবল নিম্নলিখিত:

string = "ab1cd1ef"
string = string.replace("1","") 

print string
# result: "abcdef"

এটি একটি লুপে রাখুন:

a = "a!b@c#d$"
b = "!@#$"
for char in b:
    a = a.replace(char,"")

print a
# result: "abcd"

26
এটি প্রতিটি লুপে স্ট্রিংয়ের একটি অনুলিপি তৈরি করবে, এটি পছন্দসই নয়। এছাড়াও এটি খুব ভাল পাইথন নয়। পাইথনে আপনি পরিবর্তে for char in b: a=a.replace(char,"")
এটির

2
ব্যবহারকারী সংজ্ঞায়িত ভেরিয়েবলগুলি ব্যবহার করুন যা সিস্টেমের ক্লাসগুলিকে ওভারল্যাপ করে কোনও ভাল ধারণা নয়। আপনি CHAR এর পরিবর্তে ST এবং C এর পরিবর্তে পরিবর্তনশীল STRING ব্যবহার করতে পারেন।
আইরাত

চাহিদা হতে string=string.replace("1","")পরিবর্তে। আপনি এই উদাহরণটি আপনার উদাহরণের লুপ অংশে বাছাই করেছেন তবে বেশিরভাগ লোক এ জাতীয় প্রশ্নটির জন্য প্রথমে কোডটি কিছুটা হাতছাড়া না করার আগ পর্যন্ত আপনার উত্তরটি পড়বে না।
কোডমেড

একটি ভাল সমাধান তবে অন্যগুলির মধ্যে একটি হিসাবে পাইথন-এস্কের মতো নয়।
স্টিভ

45
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'

অন্য স্ট্রিং ডিলিমিটার যেমন '' 'বা "
আলিসবোয়া

1
আপনার যদি এমন প্রচুর অক্ষর রয়েছে যা নিষিদ্ধ, আপনি আপনার কোডটিকে প্রথমে একটি সেটে পরিণত করে দ্রুত করতে পারেন। blacklist = set('?:!/;')এবং তারপরে''.join(c for c in line if c not in blacklist)
বরিস

32

re.subপাইথন ৩.৩ হিসাবে নিয়মিত প্রকাশের সাথে সহজ প্যাসি

re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)

উদাহরণ

>>> import re

>>> line = 'Q: Do I write ;/.??? No!!!'

>>> re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)
'QDoIwriteNo'

ব্যাখ্যা

ইন রেগুলার এক্সপ্রেশনের (Regex), |একটি লজিক্যাল নয় অথবা এবং \স্পেস এবং বিশেষ অক্ষর প্রকৃত Regex কমান্ড হতে পারে পালাতে। যেখানে subঘোরা প্রতিকল্পন, খালি স্ট্রিং সঙ্গে এই ক্ষেত্রে ''


22

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

>>> import string
>>> import re
>>>
>>> phrase = '  There were "nine" (9) chick-peas in my pocket!!!      '
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)

'Therewerenine9chick-peasinmypocket'

পাইথন থেকে নিয়মিত প্রকাশের ডকুমেন্টেশন :

অক্ষরের মধ্যে নয় এমন অক্ষরগুলি সেটটি পরিপূরক করে মেলানো যেতে পারে। যদি সেটটির প্রথম অক্ষর হয় তবে সেটিতে থাকা '^'সমস্ত অক্ষর মিলবে। উদাহরণস্বরূপ, [^5]'5' [^^]ব্যতীত অন্য কোনও চরিত্রের সাথে মিলবে , এবং অন্য কোনও চরিত্রের সাথে মিলবে '^'^এটি সেটের প্রথম চরিত্র না হলে এর কোনও বিশেষ অর্থ নেই।


19

প্রশ্নকারী প্রায় এটি ছিল। পাইথনের বেশিরভাগ জিনিসের মতো উত্তরটি আপনার ভাবার চেয়ে সহজ।

>>> line = "H E?.LL!/;O:: "  
>>> for char in ' ?.!/;:':  
...  line = line.replace(char,'')  
...
>>> print line
HELLO

লুপ জিনিসটির জন্য / জন্য আপনাকে নেস্টেড করতে হবে না, তবে আপনাকে প্রতিটি চরিত্র পৃথকভাবে পরীক্ষা করতে হবে।


হ্যাঁ আমি জানি, সম্ভবত খুব দেরী হয়েছে, তবে আপনি যদি এড়িয়ে যান তবে কাজ করা উচিত। : এই ভালো লেগেছে: লাইন = line.replace ( '' ',' ') পড়তে learnpythonthehardway.org/book/ex10.html
Aiyion.Prime

এটি সম্ভবত পারফরম্যান্স নয় কারণ আপনি প্রতিটি চরিত্রের জন্য একটি নতুন স্ট্রিং বরাদ্দ করছেন
ওয়ানক্রিটের

14
line = line.translate(None, " ?.!/;:")

2
+1 ইউনিকোড ব্যবহার করার সময় মুছার স্ট্রিংয়ের পরিবর্তে মুছতে কোনও অনুবাদ স্থাপন করতে হবে। docs.python.org/library/stdtyype.html#str.translate
কেভপি

এটি দুর্দান্ত পরামর্শ (রেফার: docs.python.org/2/library/string.html#string.translate ) ইউনিকোড নোটটিও ভাল।
cgseller

11
>>> s = 'a1b2c3'
>>> ''.join(c for c in s if c not in '123')
'abc'

2
আমার উত্তরটি মূল প্রশ্নের সমাধান দেয় তবে আমার সমাধানটি কেন আদর্শ হতে পারে না সে সম্পর্কে আমি প্রতিক্রিয়াতে আগ্রহী (একটি সম্ভবত ওপিও) was আমি কি নতুন প্রশ্ন তৈরি করে প্রসঙ্গে এই প্রশ্নটি রেফার করেছিলাম?
আইটকিন

এটি আমার ভোট পায়। পাইথন সংক্ষিপ্ত
স্টিভ

9

স্ট্রিংগুলি পাইথনে অপরিবর্তনীয়। replaceপদ্ধতি প্রতিস্থাপন পরে একটি নতুন স্ট্রিং ফেরৎ। চেষ্টা করুন:

for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')

আপনি কীভাবে একই লাইনে পুনরাবৃত্তি করতে এবং এটি সংশোধন করতে পারেন?
ইউরোরো

1
@eumiro: ওভার পুনরাবৃত্তির আয় মূল line
গ্রেগ হিউগিল

জানা ভাল! সুতরাং আমি যদি একটি অ্যারের উপর পুনরাবৃত্তি করি, তবে আমি একটি মূল অ্যারে দিয়ে পুনরাবৃত্তি করি। একটি পুনরাবৃত্তির মাধ্যমে আইট্রেটেশন সম্ভব হবে না।
ইউরোমো

9

আমি অবাক হয়েছিলাম যে বিল্টিন ফিল্টার ফাংশনটি ব্যবহারের জন্য এখনও কেউ সুপারিশ করেনি ।

    import operator
    import string # only for the example you could use a custom string

    s = "1212edjaq"

বলুন যে আমরা সমস্ত কিছুই ফিল্টার করতে চাই যা কোনও সংখ্যা নয়। ফিল্টার বিল্টিন পদ্ধতি ব্যবহার করে ... ... জেনারেটর এক্সপ্রেশনের সমতুল্য (আইটেমের জন্য আইটেমের জন্য যদি ফাংশন (আইটেম) থাকে)) "[ পাইথন 3 বিল্টিনস: ফিল্টার ]

    sList = list(s)
    intsList = list(string.digits)
    obj = filter(lambda x: operator.contains(intsList, x), sList)))

পাইথন 3 এ এটি ফিরে আসে

    >>  <filter object @ hex>

একটি মুদ্রিত স্ট্রিং পেতে,

    nums = "".join(list(obj))
    print(nums)
    >> "1212"

আমি কীভাবে ফিল্টার তা নিশ্চিত নইদক্ষতার দিক থেকে র‌্যাঙ্ক করে তবে তালিকা বোঝাপড়া এবং এগুলি করার সময় কীভাবে ব্যবহার করতে হয় তা জানা ভাল।

হালনাগাদ

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

      num = "".join([i for i in s if i.isdigit()])

এটাই. রিটার্নটি সমস্ত অক্ষরের একটি স্ট্রিং হবে যা মূল স্ট্রিংয়ের অঙ্ক digit

আপনার কাছে গ্রহণযোগ্য / অগ্রহণযোগ্য অক্ষরের একটি নির্দিষ্ট তালিকা থাকলে আপনার তালিকার বোঝার অংশটি কেবল 'যদি' সামঞ্জস্য করতে হবে।

      target_chars = "".join([i for i in s if i in some_list]) 

বা বিকল্পভাবে,

      target_chars = "".join([i for i in s if i not in some_list])

operator.containsআপনি যদি lambdaযাইহোক ব্যবহার করছেন তবে ব্যবহার করার কোনও কারণ নেই । lambda x: operator.contains(intsList, x)বানান করা উচিত lambda x: x in intsList, বা আপনি সি-স্তরের চেক পাওয়ার চেষ্টা করছেন, intsList.__contains__(কিছু lambdaনয়) কৌশলটি করবে।
শ্যাডোর্যাঞ্জার

8

ব্যবহার করে filter, আপনার কেবল একটি লাইন দরকার

line = filter(lambda char: char not in " ?.!/;:", line)

এটি স্ট্রিংটিকে পুনরাবৃত্ত হিসাবে বিবেচনা করে এবং প্রতিটি অক্ষর পরীক্ষা করে যদি lambdaপ্রত্যাবর্তন করে True:

>>> help(filter)
Help on built-in function filter in module __builtin__:

filter(...)
    filter(function or None, sequence) -> list, tuple, or string

    Return those items of sequence for which function(item) is true.  If
    function is None, return the items that are true.  If sequence is a tuple
    or string, return the same type, else return a list.

4

এই কাজটি অর্জনের কয়েকটি সম্ভাব্য উপায় এখানে:

def attempt1(string):
    return "".join([v for v in string if v not in ("a", "e", "i", "o", "u")])


def attempt2(string):
    for v in ("a", "e", "i", "o", "u"):
        string = string.replace(v, "")
    return string


def attempt3(string):
    import re
    for v in ("a", "e", "i", "o", "u"):
        string = re.sub(v, "", string)
    return string


def attempt4(string):
    return string.replace("a", "").replace("e", "").replace("i", "").replace("o", "").replace("u", "")


for attempt in [attempt1, attempt2, attempt3, attempt4]:
    print(attempt("murcielago"))

PS: পরিবর্তে "?! / /;:" ব্যবহার করে উদাহরণগুলি স্বর ব্যবহার করে ... এবং হ্যাঁ, "মুরসিএলগো" স্প্যানিশ শব্দটি ব্যাট ... মজার শব্দ যা এতে সমস্ত স্বর রয়েছে :)

পিএস 2: আপনি যদি পারফরম্যান্সে আগ্রহী হন তবে আপনি এই প্রচেষ্টাগুলি একটি সাধারণ কোডের মাধ্যমে পরিমাপ করতে পারেন:

import timeit


K = 1000000
for i in range(1,5):
    t = timeit.Timer(
        f"attempt{i}('murcielago')",
        setup=f"from __main__ import attempt{i}"
    ).repeat(1, K)
    print(f"attempt{i}",min(t))

আমার বাক্সে আপনি পাবেন:

attempt1 2.2334518376057244
attempt2 1.8806643818474513
attempt3 7.214925774955572
attempt4 1.7271184513757465

সুতরাং মনে হচ্ছে প্রচেষ্টা 4 এই নির্দিষ্ট ইনপুটটির জন্য দ্রুততম one


1
আপনি অনাবশ্যক তৈরি listকরছেন attempt1এবং "aeiou"সরলতার জন্য টিপলটি পুনরায় লেখা যেতে পারে (অপসারণ [এবং ]কোনও তালিকা তৈরি না করেই জেনারেটরে রূপান্তরিত হবে)। আপনি প্রচুর পরিমাণে মধ্যস্থতার স্ট্রিং তৈরি করেছেন attemt2, আপনি attempt3যেখানে r'[aeiou]'এক পাসে ব্যবহার করতে পারবেন সেখানে রিজেক্সের একাধিক অ্যাপ্লিকেশন ব্যবহার করেন। প্রত্যেকের ত্রুটি রয়েছে - জিনিসগুলি করার বিভিন্ন উপায় দেখে ভাল লাগে তবে দয়া করে তাদের ভাল চেষ্টা হিসাবেও ঠিক করুন
প্যাট্রিক আর্টনার

1
@ পেট্রিকআর্টনার আপনি একদম ঠিক বলেছেন ... এই কাজটি অর্জনের লক্ষ্যে আমি যে ডজনগুলি উপায় মনে করেছি তা থেকে আমি ধীরে ধীরে বেছে নিয়েছি (ওপিকে কিছু সহজ উপায় দেখাতে চেয়েছিলাম) ... এটি বলেছিল, আপনার পরে ছেলেরা অন্য থ্রেডটি বন্ধ করে দিয়েছি আমি ইতিমধ্যে উত্তর দেওয়া পুরানো থ্রেডটিতে আরও প্রচেষ্টা করার প্রেরণা হারিয়েছি, তাই ... :)। যদিও পয়েন্ট জন্য ধন্যবাদ।
বিপিএল

@ পেট্রিকআর্টনার ঠিক আছে ... কেবলমাত্র স্বার্থে একটি নতুন যুক্ত করেছেন, "প্রচেষ্টা 4" ... পরিমাপ করা হয়নি তবে আমি মনে করি যে দ্রুততর হওয়া উচিত
বিপিএল

1
@ পেট্রিকআর্টনার সম্পাদিত ... চেষ্টা 4 সামান্য প্রচেষ্টার থেকে দ্রুততম ছিল। যাইহোক, আমি এই জিনিসগুলির সাথে বেশি সময় নষ্ট করছি না :)
বিপিএল

3

এখানে আমার পাইথন 2/3 সামঞ্জস্যপূর্ণ সংস্করণ। যেহেতু অনুবাদ এপি বদল হয়েছে।

def remove(str_, chars):
    """Removes each char in `chars` from `str_`.

    Args:
        str_: String to remove characters from
        chars: String of to-be removed characters

    Returns:
        A copy of str_ with `chars` removed

    Example:
            remove("What?!?: darn;", " ?.!:;") => 'Whatdarn'
    """
    try:
        # Python2.x
        return str_.translate(None, chars)
    except TypeError:
        # Python 3.x
        table = {ord(char): None for char in chars}
        return str_.translate(table)

আমি dict.fromkeys(map(ord, '!@#$'))মানচিত্র তৈরি করতে ব্যবহার করব ।
মার্টিজন পিটারস

mapসাধারণত একটি তালিকা / ডিক্ট / সেট / জেনারেটর বোঝার চেয়ে কম পঠনযোগ্য। এতটাই যে গুইডো ভাষা থেকে এটিকে সরাতে চেয়েছিলেন । ব্যবহার fromkeysকরাও কিছুটা চালাক এবং ডক চেকের প্রয়োজন।
ব্রাইস গিন্টা

1
@ মার্তিজিনপিটারস: পাইথন 3-এর ক্ষেত্রে এটি ঠিক হওয়া উচিত str.maketrans('', '', chars), যা ordরূপান্তর এবং dictনির্মাণকাজকে একসাথে পরিচালনা করে (উদ্দেশ্যটির সাথে আরও সুস্পষ্ট হওয়ার বিষয়টি উল্লেখ না করা, যেহেতু এটির সাথে যুক্ত হওয়ার জন্য ডিজাইন করা হয়েছে str.translate)।
শ্যাডোর্যাঞ্জার

1
#!/usr/bin/python
import re

strs = "how^ much for{} the maple syrup? $20.99? That's[] ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!|a|b]',r' ',strs)#i have taken special character to remove but any #character can be added here
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)#for removing special character
print nestr

আপনি কি কথার চিহ্ন বলতে চান? কোডটি এড়াতে এবং 'স্ট্রিং হিসাবে বিবেচনা করার জন্য পুনরায় ব্যাকস্ল্যাশ রয়েছে । docs.python.org/2/library/re.html
জেসটন টায়ার

1

এটি সম্পর্কে:

def text_cleanup(text):
    new = ""
    for i in text:
        if i not in " ?.!/;:":
            new += i
    return new

1
আপনি যে সমাধানটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে কী আপনি আরও উত্তর প্রদান করতে পারেন?
অ্যাবারিসোন

একটি তালিকায় যুক্ত করা, তারপরে যোগদানের ব্যবহার
যুক্তিযুক্তকরণের

1

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

* এনবি: পাইথন ৩.x এর সাথে কাজ করে

import re  # Regular expression library


def string_cleanup(x, notwanted):
    for item in notwanted:
        x = re.sub(item, '', x)
    return x

line = "<title>My example: <strong>A text %very% $clean!!</strong></title>"
print("Uncleaned: ", line)

# Get rid of html elements
html_elements = ["<title>", "</title>", "<strong>", "</strong>"]
line = string_cleanup(line, html_elements)
print("1st clean: ", line)

# Get rid of special characters
special_chars = ["[!@#$]", "%"]
line = string_cleanup(line, special_chars)
print("2nd clean: ", line)

স্ট্রিং_ক্লানআপ ফাংশনে এটি আপনার স্ট্রিং এক্স এবং আপনার তালিকাটিকে আর্গুমেন্ট হিসাবে অবাঞ্ছিত করে। উপাদান বা প্যাটার্নের তালিকার প্রতিটি আইটেমের জন্য, বিকল্পের প্রয়োজন হলে এটি করা হবে।

আউটপুট:

Uncleaned:  <title>My example: <strong>A text %very% $clean!!</strong></title>
1st clean:  My example: A text %very% $clean!!
2nd clean:  My example: A text very clean

1

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

words = "things"
removed = "%s%s" % (words[:3], words[-1:])

এর ফলে 'এটি' শব্দটি রাখা 'মুছে ফেলা' হবে।

বিন্যাসটি মুদ্রণের স্ট্রিংয়ের মধ্য দিয়ে মাঝারি ভেরিয়েবলগুলি মুদ্রণের জন্য খুব সহায়ক হতে পারে। এটি ভেরিয়েবলের ডেটা টাইপ অনুসরণ করে % ব্যবহার করে যে কোনও ডেটা টাইপ সন্নিবেশ করতে পারে ; সমস্ত ডেটা প্রকারভেদ % s এবং ভাসমান (ওরফে দশমিক) ব্যবহার করতে পারে এবং পূর্ণসংখ্যাগুলি % d ব্যবহার করতে পারে ।

স্লাইসিংগুলি স্ট্রিংগুলির উপর জটিল নিয়ন্ত্রণের জন্য ব্যবহার করা যেতে পারে। আমি যখন শব্দগুলি রাখি [: 3] , এটি আমাকে প্রথম থেকে স্ট্রিংয়ের সমস্ত অক্ষর বাছাই করতে দেয় (কোলন সংখ্যার আগে হয়, এর অর্থ 'প্রথম থেকে শুরু করে') চতুর্থ চরিত্রের হয়ে থাকে (এতে চতুর্থ অন্তর্ভুক্ত থাকে) চরিত্র)। 4 র্থ অবস্থান পর্যন্ত 3 টির সমান কারণ পাইথনটি 0 থেকে শুরু হয় Then তারপরে, আমি যখন শব্দটি লিখি [-1:] , তখন এর অর্থ দ্বিতীয় স্তরের শেষ অক্ষর (কোলনের সংখ্যার পিছনে থাকে)। -1 লাগানো পাইথনকে প্রথম চরিত্রের চেয়ে শেষ চরিত্র থেকে গণনা করবে। আবার, পাইথন 0 থেকে শুরু হবে। সুতরাং, শব্দের [-1:] মূলত অর্থ 'দ্বিতীয় শেষ অক্ষর থেকে শুরু করে স্ট্রিংয়ের শেষ পর্যন্ত।

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

আমি যদি একের পর একাধিক অক্ষর মুছে ফেলতে চাই তবে আমি কেবল [] (টুকরো টুকরো অংশ) এর মধ্যে সংখ্যাগুলি স্থানান্তরিত করব। বা যদি আমি বিভিন্ন অবস্থান থেকে একাধিক অক্ষর মুছে ফেলতে চাই তবে আমি একবারে একাধিক টুকরো একসাথে স্যান্ডউইচ করতে পারি।

উদাহরণ:

 words = "control"
 removed = "%s%s" % (words[:2], words[-2:])

সরানো সমান 'শীতল'।

words = "impacts"
removed = "%s%s%s" % (words[1], words[3:5], words[-1])

সরানো সমান 'ম্যাকস'।

এই ক্ষেত্রে, [3: 5] এ চরিত্র মানে অবস্থান 3 চরিত্র মাধ্যমে অবস্থান 5 এর (চূড়ান্ত অবস্থানে অক্ষরটি বাদ দিয়ে)।

মনে রাখবেন, পাইথন 0 এ গণনা শুরু করে , তাই আপনারও দরকার হবে।


0

আর একবার চেষ্টা কর:

def rm_char(original_str, need2rm):
    ''' Remove charecters in "need2rm" from "original_str" '''
    return original_str.translate(str.maketrans('','',need2rm))

এই পদ্ধতিটি অজগর 3.5.3 এ ভাল কাজ করে


0

আপনি পুনরায় মডিউলটির নিয়মিত এক্সপ্রেশন প্রতিস্থাপন ব্যবহার করতে পারেন। ^ এক্সপ্রেশনটি ব্যবহার করে আপনি আপনার স্ট্রিং থেকে যা চান ঠিক তা বাছাই করতে পারবেন।

    import re
    text = "This is absurd!"
    text = re.sub("[^a-zA-Z]","",text) # Keeps only Alphabets
    print(text)

এর আউটপুট হবে "থিসিসবার্সড"। কেবলমাত্র চিহ্নের পরে নির্দিষ্ট জিনিসগুলি প্রদর্শিত হবে।


0

স্ট্রিং পদ্ধতিটি replaceমূল স্ট্রিংটি সংশোধন করে না। এটি আসলটি একা ছেড়ে দেয় এবং পরিবর্তিত অনুলিপি দেয়।

আপনি যা চান তা হ'ল কিছু: line = line.replace(char,'')

def replace_all(line, )for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')
    return line

যাইহোক, প্রতিবার একটি অক্ষর মুছে ফেলা হয়েছে এমন একটি নতুন স্ট্রিং তৈরি করা অত্যন্ত অযোগ্য। পরিবর্তে আমি নিম্নলিখিতটি সুপারিশ করি:

def replace_all(line, baddies, *):
    """
    The following is documentation on how to use the class,
    without reference to the implementation details:

    For implementation notes, please see comments begining with `#`
    in the source file.

    [*crickets chirp*]

    """

    is_bad = lambda ch, baddies=baddies: return ch in baddies
    filter_baddies = lambda ch, *, is_bad=is_bad: "" if is_bad(ch) else ch
    mahp = replace_all.map(filter_baddies, line)
    return replace_all.join('', join(mahp))

    # -------------------------------------------------
    # WHY `baddies=baddies`?!?
    #     `is_bad=is_bad`
    # -------------------------------------------------
    # Default arguments to a lambda function are evaluated
    # at the same time as when a lambda function is
    # **defined**.
    #
    # global variables of a lambda function
    # are evaluated when the lambda function is
    # **called**
    #
    # The following prints "as yellow as snow"
    #
    #     fleece_color = "white"
    #     little_lamb = lambda end: return "as " + fleece_color + end
    #
    #     # sometime later...
    #
    #     fleece_color = "yellow"
    #     print(little_lamb(" as snow"))
    # --------------------------------------------------
replace_all.map = map
replace_all.join = str.join

-1

নীচে .. নিয়মিত অভিব্যক্তি ধারণা ব্যবহার করে ..

ipstring ="text with symbols!@#$^&*( ends here"
opstring=''
for i in ipstring:
    if i.isalnum()==1 or i==' ':
        opstring+=i
    pass
print opstring

-1

পাইথন 3.5 তে

যেমন,

os.rename(file_name, file_name.translate({ord(c): None for c in '0123456789'}))

স্ট্রিং থেকে সমস্ত নম্বর সরাতে


-1

আপনি সেট ব্যবহার করতে পারেন

    charlist = list(set(string.digits+string.ascii_uppercase) - set('10IO'))
    return ''.join([random.SystemRandom().choice(charlist) for _ in range(passlen)])

উত্তর দেওয়ার সময় আপনার উত্তরটি হ'ল কেন তা সম্পর্কে কিছুটা ব্যাখ্যা দেওয়া ভাল ।
স্টিফেন রাউচ

-1

পুনরাবৃত্তি বিভক্ত: s = স্ট্রিং; চরগুলি = অক্ষর মুছে ফেলার জন্য

def strip(s,chars):
if len(s)==1:
    return "" if s in chars else s
return strip(s[0:int(len(s)/2)],chars) +  strip(s[int(len(s)/2):len(s)],chars)

উদাহরণ:

print(strip("Hello!","lo"))    #He!

-1

ডিরেক্টরিতে প্রতিটি ফাইলের জন্য # ফাইলের নাম পরিবর্তন করুন

   file_list = os.listdir (r"D:\Dev\Python")

   for file_name in file_list:

       os.rename(file_name, re.sub(r'\d+','',file_name))

-1

এমনকি নীচের পদ্ধতির কাজ করে

line = "a,b,c,d,e"
alpha = list(line)
        while ',' in alpha:
            alpha.remove(',')
finalString = ''.join(alpha)
print(finalString)

আউটপুট: abcde


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