পাইথনের একটি স্ট্রিং থেকে বর্ণচিহ্নগুলি বাদ দিয়ে সবকিছু বাদ দেওয়া


337

পাইথন ব্যবহার করে স্ট্রিং থেকে সমস্ত অ্যালফানিউমারিক অক্ষর ফেলা যাওয়ার সর্বোত্তম উপায় কী?

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

রেকর্ডের জন্য, আমি কেবল পিরিয়ড এবং কমাগুলি (এবং অন্যান্য বিরামচিহ্নগুলি), কিন্তু উদ্ধৃতিগুলি, বন্ধনী ইত্যাদির জন্যও চাই না


7
আপনি কি 'æøå', 'مرحبا', 'สวัสดี', 'こ ん に ち は' এর মতো আন্তর্জাতিক বর্ণমালা সংক্রান্ত চরগুলি সম্পর্কে যত্নবান হন?
পিমিন কনস্ট্যান্টিন কেফলালোকস

4
@ পিমনকনস্ট্যান্টিন কেফালিউকোস হ্যাঁ আমি আন্তর্জাতিক চরগুলি সম্পর্কে যত্নশীল, তাই পুনরায় ইউনিকোড ব্যবহারের গ্রহণযোগ্য উত্তর সম্পর্কে আমার মন্তব্য।
মার্ক ভ্যান লেন্ট

উত্তর:


336

আমি কৌতূহল ছাড়াই সবেমাত্র কিছু কার্য সম্পাদন করেছি। এই পরীক্ষাগুলিতে আমি স্ট্রিং string.printable(অন্তর্নির্মিত stringমডিউলটির অংশ) থেকে অ-অক্ষরীয় অক্ষরগুলি সরিয়ে দিচ্ছি । সংকলিত ব্যবহার '[\W_]+'এবং pattern.sub('', str)দ্রুততম হতে পাওয়া যায়নি।

$ python -m timeit -s \
     "import string" \
     "''.join(ch for ch in string.printable if ch.isalnum())" 
10000 loops, best of 3: 57.6 usec per loop

$ python -m timeit -s \
    "import string" \
    "filter(str.isalnum, string.printable)"                 
10000 loops, best of 3: 37.9 usec per loop

$ python -m timeit -s \
    "import re, string" \
    "re.sub('[\W_]', '', string.printable)"
10000 loops, best of 3: 27.5 usec per loop

$ python -m timeit -s \
    "import re, string" \
    "re.sub('[\W_]+', '', string.printable)"                
100000 loops, best of 3: 15 usec per loop

$ python -m timeit -s \
    "import re, string; pattern = re.compile('[\W_]+')" \
    "pattern.sub('', string.printable)" 
100000 loops, best of 3: 11.2 usec per loop

2
অত্যন্ত আকর্ষণীয় ফলাফল: আমি আশা করি নিয়মিত প্রকাশগুলি ধীর হবে। মজার ব্যাপার হচ্ছে, আমি অন্য একটি বিকল্প (এই চেষ্টা valid_characters = string.ascii_letters + string.digitsদ্বারা অনুসরণ join(ch for ch in string.printable if ch in valid_characters)এবং এটি চেয়ে দ্রুত 6 মাইক্রোসেকেন্ড ছিল isalnum()।। Regexp যদিও চেয়ে বিকল্প এখনও অনেক ধীর
DrAl

+1, সময় পরিমাপ ভাল! (তবে pattern.sub('', string.printable)উপদ্বীপে , পরিবর্তে করুন - আপনার আরই বিষয়বস্তু থাকলে রি.স্যাব কল করতে বোকা! -)।
অ্যালেক্স মার্টেলি

46
রেকর্ডের জন্য: re.compile('[\W_]+', re.UNICODE)এটি ইউনিকোড নিরাপদ করতে ব্যবহার করুন ।
মার্ক ভ্যান লেন্ট

3
সাদা জায়গা না সরিয়ে আপনি কীভাবে এটি করবেন?
ম্যাডুলাস

6
সাদা স্থান অপসারণ ছাড়া এটা করতে: re.sub ( '[\ ওয়াট: _]', '', বাক্য, পতাকা = re.UNICODE)
PALEN

268

উদ্ধারের নিয়মিত প্রকাশ:

import re
re.sub(r'\W+', '', your_string)

পাইথন সংজ্ঞা দ্বারা '\W== [^a-zA-Z0-9_], যা বাদ সব numbers, lettersএবং_


2
রেজিপ্সে প্লাস সাইনটি কী করবে? (আমি এটির অর্থ কী তা জানি, কেন এটি পুনর্বিবেচনার প্রয়োজনের জন্য কেবল আগ্রহী))
মার্ক ভ্যান লেন্ট

7
@ মার্ক: আমি ধারণা করি এটি প্রতিস্থাপনের গতি বাড়িয়ে দেবে কারণ প্রতিস্থাপনটি একসাথে সমস্ত ব্লকযুক্ত সমস্ত শব্দহীন অক্ষরকে একের পর এক অপসারণের চেয়ে মুক্তি দেবে।
DrAl

2
হ্যাঁ, আমি কিছুক্ষণ আগে কিছু পারফরম্যান্স সমালোচনামূলক কোড টিউন করার সময় এটি বেঁধে রেখেছি। যদি অক্ষরগুলির উল্লেখযোগ্য স্প্যান থাকে তবে দ্রুতগতি প্রতিস্থাপন করা বিশাল।
আন্টস আসমা

20
এটি এই ক্ষেত্রে প্রাসঙ্গিক নাও হতে পারে, তবে \Wপাশাপাশি আন্ডারস্কোরগুলি রাখবে।
Blixt

12
ব্ল্যাক্টের টিপ অনুসরণ করে, আপনি যদি কেবল চিঠি এবং সংখ্যা চান তবে আপনি পুনরায় সা.ইউ. (r '[^ a-zA-Z0-9]', '', আপনার_আরক্ষক) করতে পারেন
নিগিনি

68

Str.translate () পদ্ধতিটি ব্যবহার করুন ।

মনে করে আপনি প্রায়শই এটি করছেন:

(1) একবার আপনি মুছে ফেলতে চান এমন সমস্ত অক্ষর সমন্বিত একটি স্ট্রিং তৈরি করুন:

delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())

(২) আপনি যখনই কোনও স্ট্রিং স্ক্রঞ্চ করতে চান:

scrunched = s.translate(None, delchars)

সেটআপ ব্যয়টি সম্ভবত সম্ভবত ডট কমের সাথে তুলনা করে; প্রান্তিক ব্যয় কম:

C:\junk>\python26\python -mtimeit -s"import string;d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)"
100000 loops, best of 3: 2.04 usec per loop

C:\junk>\python26\python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r'[\W_]+')" "r.sub('',s)"
100000 loops, best of 3: 7.34 usec per loop

দ্রষ্টব্য: স্ট্রিং.প্রিন্টেবলটিকে বেঞ্চমার্ক ডেটা হিসাবে ব্যবহার করা প্যাটার্নটিকে [['W _] +' একটি অনুচিত সুবিধা দেয় ; সমস্ত অ-অক্ষর অক্ষর একটি গুচ্ছের মধ্যে রয়েছে ... সাধারণ তথ্যতে একাধিক প্রতিস্থাপন করতে হবে:

C:\junk>\python26\python -c "import string; s = string.printable; print len(s),repr(s)"
100 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

আপনি পুনরায় সাবিসকে আরও কিছু কাজ দেওয়ার পরে কি হবে তা এখানে রয়েছে:

C:\junk>\python26\python -mtimeit -s"d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s='foo-'*25" "s.translate(None,d)"
1000000 loops, best of 3: 1.97 usec per loop

C:\junk>\python26\python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)"
10000 loops, best of 3: 26.4 usec per loop

1
অনুবাদ ব্যবহার করা আসলেই কিছুটা দ্রুত। প্রতিস্থাপন / অনুবাদ করার আগে ঠিক লুপের জন্য যুক্ত করার পরেও (সেটআপের ব্যয়টি কম ওজনের করতে) এখনও আমার মেশিনে রেজিপ্লেক্সের চেয়ে প্রায় 17 গুণ দ্রুত অনুবাদ করে। জানা ভাল.
মার্ক ভ্যান লেন্ট

3
এটি অবশ্যই সবচেয়ে পাইথোনিক সমাধান।
কোডিম্যান

1
এটি প্রায় আমাকে string.punctuation''.join(c for c in map(chr, range(256)) if not c.isalnum())
বোঝায়

1
দ্রষ্টব্য যে এটি strবস্তুর জন্য নয় তবে অবজেক্টের জন্য কাজ unicodeকরে।
ইয়াভাবর

@ জন মেশিন কি সেই তালিকাটি বোঝার জন্য যুক্তি হিসাবে পাস হচ্ছে .join()?
অ্যাডজুনেক্টপ্রসফেসরফ্যালকন

41

আপনি চেষ্টা করতে পারেন:

print ''.join(ch for ch in some_string if ch.isalnum())

15
>>> import re
>>> string = "Kl13@£$%[};'\""
>>> pattern = re.compile('\W')
>>> string = re.sub(pattern, '', string)
>>> print string
Kl13

আমি আপনার উত্তরটি পছন্দ করেছিলাম তবে এটি আরবি অক্ষরগুলিও সরিয়ে দেয় আপনি কীভাবে তা রাখবেন তা আপনি আমাকে বলতে পারেন
চারিফ ডিজেড

13

কেমন:

def ExtractAlphanumeric(InputString):
    from string import ascii_letters, digits
    return "".join([ch for ch in InputString if ch in (ascii_letters + digits)])

এটি সংক্ষিপ্ত এবং স্ট্রিংগুলিতে InputStringউপস্থিত থাকলে অক্ষরের একটি তালিকা তৈরি করতে তালিকার বোঝাপড়াটি ব্যবহার করে কাজ করে । এরপরে তালিকায় একসাথে একটি স্ট্রিংয়ের সাথে যোগ হয়।ascii_lettersdigits


দেখে মনে হচ্ছে স্ট্রিং.এএসসিআই_লেটারগুলিতে কেবল অক্ষর (দুহ) থাকে এবং সংখ্যারও না। আমারও সংখ্যাগুলি দরকার ...
মার্ক ভ্যান লেন্ট

স্ট্রিং.ডিজিট যুক্ত করা প্রকৃতপক্ষে যে সমস্যাটি আমি সবে উল্লেখ করেছি তা সমাধান করবে। :)
মার্ক ভ্যান লেন্ট

হ্যাঁ, আমি বুঝতে পেরেছিলাম যখন আমি আপনার প্রশ্নটি পড়তে ফিরে গেলাম। স্ব নোট: পড়তে শিখুন!
DrAl

4

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

PERMITTED_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-" 
someString = "".join(c for c in someString if c in PERMITTED_CHARS)

2
অনুমতিযুক্ত অক্ষরগুলিকে হার্ডকোডিংয়ের পরিবর্তে, যা সূক্ষ্ম ত্রুটির প্রবণতা রয়েছে, ব্যবহার করুন string.digits + string.ascii_letters + '_-'
অবধি 43

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

মিডল গ্রাউন্ড হিসাবে, আপনি এই পরামর্শগুলি একত্রিত করতে পারেন SPECIAL_CHARS = '_-'এবং তারপরে ব্যবহার করতে পারেনstring.digits + string.ascii_letters + SPECIAL_CHARS
বুভিনজেজে

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

আমি আপনাকে শুনতে পাচ্ছি! আপনি এখানে আপনার চরিত্রের সেটটি আরও সুনির্দিষ্ট করতে চান সে ক্ষেত্রে আমার আসল বিষয়টি চূড়ান্ত নমনীয়তা।
বুভিন জে

4
sent = "".join(e for e in sent if e.isalpha())

আমি ব্যাখ্যা করার চেষ্টা করব: এটি সমস্ত স্ট্রিং অক্ষরগুলির মধ্যে দিয়ে গেছে e for e in sentএবং if e.isalpha()বর্তমানের বর্ণমালার প্রতীক যদি বিবৃতি হিসাবে থাকে তবে যদি তা হয় - এটির sentমাধ্যমে চলকটিতে যোগ দেয় sent = "".join()এবং সমস্ত অ বর্ণানুক্রমিক চিহ্নগুলি ""(খালি স্ট্রিং) দিয়ে প্রতিস্থাপন করা হবে কারণ এর joinফাংশন।
সায়সানিন

যেহেতু এটি সি রেজেক্সের উপর নির্ভর না করে চরিত্রের প্রতি লুপ করছে, এটি কি খুব ধীর?
dcsan


2

এএসসিআইআই প্রিন্টেবলগুলির এলোমেলো স্ট্রিংয়ের সময়:

from inspect import getsource
from random import sample
import re
from string import printable
from timeit import timeit

pattern_single = re.compile(r'[\W]')
pattern_repeat = re.compile(r'[\W]+')
translation_tb = str.maketrans('', '', ''.join(c for c in map(chr, range(256)) if not c.isalnum()))


def generate_test_string(length):
    return ''.join(sample(printable, length))


def main():
    for i in range(0, 60, 10):
        for test in [
            lambda: ''.join(c for c in generate_test_string(i) if c.isalnum()),
            lambda: ''.join(filter(str.isalnum, generate_test_string(i))),
            lambda: re.sub(r'[\W]', '', generate_test_string(i)),
            lambda: re.sub(r'[\W]+', '', generate_test_string(i)),
            lambda: pattern_single.sub('', generate_test_string(i)),
            lambda: pattern_repeat.sub('', generate_test_string(i)),
            lambda: generate_test_string(i).translate(translation_tb),

        ]:
            print(timeit(test), i, getsource(test).lstrip('            lambda: ').rstrip(',\n'), sep='\t')


if __name__ == '__main__':
    main()

ফলাফল (পাইথন ৩.7):

       Time       Length                           Code                           
6.3716264850008880  00  ''.join(c for c in generate_test_string(i) if c.isalnum())
5.7285426190064750  00  ''.join(filter(str.isalnum, generate_test_string(i)))
8.1875841680011940  00  re.sub(r'[\W]', '', generate_test_string(i))
8.0002205439959650  00  re.sub(r'[\W]+', '', generate_test_string(i))
5.5290945199958510  00  pattern_single.sub('', generate_test_string(i))
5.4417179649972240  00  pattern_repeat.sub('', generate_test_string(i))
4.6772285089973590  00  generate_test_string(i).translate(translation_tb)
23.574712151996210  10  ''.join(c for c in generate_test_string(i) if c.isalnum())
22.829975890002970  10  ''.join(filter(str.isalnum, generate_test_string(i)))
27.210196289997840  10  re.sub(r'[\W]', '', generate_test_string(i))
27.203713296003116  10  re.sub(r'[\W]+', '', generate_test_string(i))
24.008979928999906  10  pattern_single.sub('', generate_test_string(i))
23.945240008994006  10  pattern_repeat.sub('', generate_test_string(i))
21.830899796994345  10  generate_test_string(i).translate(translation_tb)
38.731336012999236  20  ''.join(c for c in generate_test_string(i) if c.isalnum())
37.942474347000825  20  ''.join(filter(str.isalnum, generate_test_string(i)))
42.169366310001350  20  re.sub(r'[\W]', '', generate_test_string(i))
41.933375883003464  20  re.sub(r'[\W]+', '', generate_test_string(i))
38.899814646996674  20  pattern_single.sub('', generate_test_string(i))
38.636144253003295  20  pattern_repeat.sub('', generate_test_string(i))
36.201238164998360  20  generate_test_string(i).translate(translation_tb)
49.377356811004574  30  ''.join(c for c in generate_test_string(i) if c.isalnum())
48.408927293996385  30  ''.join(filter(str.isalnum, generate_test_string(i)))
53.901889764994850  30  re.sub(r'[\W]', '', generate_test_string(i))
52.130339455994545  30  re.sub(r'[\W]+', '', generate_test_string(i))
50.061149017004940  30  pattern_single.sub('', generate_test_string(i))
49.366573111998150  30  pattern_repeat.sub('', generate_test_string(i))
46.649754120997386  30  generate_test_string(i).translate(translation_tb)
63.107938601999194  40  ''.join(c for c in generate_test_string(i) if c.isalnum())
65.116287978999030  40  ''.join(filter(str.isalnum, generate_test_string(i)))
71.477421126997800  40  re.sub(r'[\W]', '', generate_test_string(i))
66.027950693998720  40  re.sub(r'[\W]+', '', generate_test_string(i))
63.315361931003280  40  pattern_single.sub('', generate_test_string(i))
62.342320287003530  40  pattern_repeat.sub('', generate_test_string(i))
58.249303059004890  40  generate_test_string(i).translate(translation_tb)
73.810345625002810  50  ''.join(c for c in generate_test_string(i) if c.isalnum())
72.593953348005020  50  ''.join(filter(str.isalnum, generate_test_string(i)))
76.048324580995540  50  re.sub(r'[\W]', '', generate_test_string(i))
75.106637657001560  50  re.sub(r'[\W]+', '', generate_test_string(i))
74.681338128997600  50  pattern_single.sub('', generate_test_string(i))
72.430461594005460  50  pattern_repeat.sub('', generate_test_string(i))
69.394243567003290  50  generate_test_string(i).translate(translation_tb)

str.maketrans& str.translateদ্রুততম, তবে এতে সমস্ত অ-এসসিআইআই অক্ষর রয়েছে। re.compile& pattern.subধীর গতিতে তবে এটি ''.join& এর চেয়ে কোনওরকম দ্রুত filter


-1

আমি যদি সঠিকভাবে বুঝতে পারি তবে সবচেয়ে সহজ উপায় হ'ল নিয়মিত ভাব প্রকাশ করা কারণ এটি আপনাকে প্রচুর স্বাচ্ছন্দ্য সরবরাহ করে তবে অন্যান্য সহজ পদ্ধতিটি লুপের জন্য ব্যবহার করা কোডটি উদাহরণ সহ আমি শব্দটির উপস্থিতি গণনা করে এবং অভিধানে সঞ্চিত করে রাখি ..

s = """An... essay is, generally, a piece of writing that gives the author's own 
argument — but the definition is vague, 
overlapping with those of a paper, an article, a pamphlet, and a short story. Essays 
have traditionally been 
sub-classified as formal and informal. Formal essays are characterized by "serious 
purpose, dignity, logical 
organization, length," whereas the informal essay is characterized by "the personal 
element (self-revelation, 
individual tastes and experiences, confidential manner), humor, graceful style, 
rambling structure, unconventionality 
or novelty of theme," etc.[1]"""

d = {}      # creating empty dic      
words = s.split() # spliting string and stroing in list
for word in words:
    new_word = ''
    for c in word:
        if c.isalnum(): # checking if indiviual chr is alphanumeric or not
            new_word = new_word + c
    print(new_word, end=' ')
    # if new_word not in d:
    #     d[new_word] = 1
    # else:
    #     d[new_word] = d[new_word] +1
print(d)

এই উত্তরটি কার্যকর হলে দয়া করে এটিকে রেট দিন!

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