পাইথন, স্ট্রিং থেকে সমস্ত অ-বর্ণমালা অক্ষর মুছুন


90

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

def mapfn(k, v):
    print v
    import re, string 
    pattern = re.compile('[\W_]+')
    v = pattern.match(v)
    print v
    for w in v.split():
        yield w, 1

আমি আশঙ্কা করছি যে বিষয়টি সম্পর্কে আমি লাইব্রেরি reবা এমনকি রেজেক্স কীভাবে ব্যবহার করব তা নিশ্চিত নই । আমি নিশ্চিত নই যে vকোনও অ-অক্ষর অক্ষর ছাড়াই নতুন লাইনটি পুনরুদ্ধার করতে কীভাবে আগত স্ট্রিংয়ে (কোনও বইয়ের লাইন) রেজেেক্স প্যাটার্নটি প্রয়োগ করতে হবে ।

পরামর্শ?


vএটি একটি বইয়ের পুরো লাইন (বিশেষত মোবিড় ডিক), আমি চরিত্রের মাধ্যমে নয় বরং কথায় কথায় কথায় চলছি। সুতরাং কিছু শব্দের শেষে একটি "," থাকতে পারে তাই "উদাসীনতা", "অভিমান" দিয়ে মানচিত্র তৈরি করে না।
কেডেকার


ললাক্স - আপনি কি আমার মতো একই প্রাক-সাক্ষাত্কার হোম অনুশীলন পেয়েছেন? মবি ডিকের 50 টি সর্বাধিক ব্যবহৃত শব্দগুলি সন্ধান করুন এবং তাদের ফ্রিকোয়েন্সি রিপোর্ট করুন। আমি এটি সি ++, আইআইআরসি
তে করেছি

4
@ মাওগ এটি আমার আন্ডারগ্রাড "ক্লাউড কম্পিউটিং" ক্লাসের একটি অনুশীলন ছিল।
কেডেকার

উত্তর:


127

ব্যবহার re.sub

import re

regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

বিকল্পভাবে, আপনি যদি কেবলমাত্র অক্ষরের একটি নির্দিষ্ট সেট সরাতে চান (অ্যাডাস্ট্রোফ হিসাবে আপনার ইনপুটটিতে ঠিক আছে ...)

regex = re.compile('[,\.!?]') #etc.

হুঁ, আমি এটিকে বেশ সন্ধান করতে পারি, তবে স্থানগুলি বাদ দিয়ে সমস্ত অ-অক্ষর সংখ্যার অপসারণের প্যাটার্নটির কী হবে?
কেডেকার

4
আপনার সংগ্রহের ক্লাসে কেবল একটি স্থান যুক্ত করুন। অর্থাত্^a-zA-Z ^a-zA-Z
লামাসেক্সগোস্টো0 এর

আপনি যদি নিউলাইনগুলি নিয়েও উদ্বিগ্ন না হন তবে এই ক্ষেত্রে a-zA-Z \n। আমি এমন একটি রেজেক্সের সন্ধান করার চেষ্টা করছি যা উভয়কে এক করে ফেলবে কিন্তু ব্যবহার করে \wবা \Wআমাকে পছন্দসই আচরণ দিচ্ছে না। \nযদি কেবল এটির প্রয়োজন হয় তবে আপনাকে যুক্ত করতে হবে ।
limasxgoesto0

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

48

আপনি যদি রেজেক্স ব্যবহার না করা পছন্দ করেন তবে আপনি চেষ্টা করতে পারেন

''.join([i for i in s if i.isalpha()])

আমি কীভাবে এতে যোগদান করব? সাথে '' .জয়িন? মুদ্রণ গুলি কেবল একটি ফিল্টার অবজেক্ট পায়
পাইরেটএপ

বাহ, আমি এটাই খুঁজছিলাম এটি কানজি, হিরাগানা, কাতকানা ইত্যাদি বিবেচনায় নেয়। kudos
root163

34

আপনি এই অক্ষরগুলি সরাতে re.sub () ফাংশনটি ব্যবহার করতে পারেন:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

পুনঃসুব (ম্যাচ প্যাটার্ন, প্রতিস্থাপন STRING, অনুসন্ধানে STRING)

  • "[^a-zA-Z]+" - এমন কোনও অক্ষরের জন্য সন্ধান করুন যা একটি-জেডএ-জেড নয়।
  • "" - "" দিয়ে মিলিত অক্ষরগুলি প্রতিস্থাপন করুন

নোট করুন যে এটি স্বরাঘাত চিঠি সরাবে: ãâàáéèçõ, ইত্যাদি
ব্র্যাড Ahrens

19

চেষ্টা করুন:

s = ''.join(filter(str.isalnum, s))

এটি স্ট্রিং থেকে প্রতিটি চর নেবে, কেবলমাত্র বর্ণমালা রাখবে এবং সেগুলি থেকে আবার একটি স্ট্রিং তৈরি করবে।


4
এই উত্তরটি আরও অনেক ব্যাখ্যা এবং প্রাসঙ্গিক ডকুমেন্টেশনের লিঙ্কগুলি ব্যবহার করতে পারে।
pdoherty926

4

দ্রুততম পদ্ধতিটি হ'ল রেজেক্স

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)

""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)


2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join

0

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

আপনি যদি এটি ইনস্টল করেন (ব্যবহার pip intall regexবা করছেন pip3 install regex) তবে আপনি ব্যবহার করতে পারেন

import regex
print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') )
// => ABCŁąćАбвdef

থেকে ইউনিকোড অক্ষর ব্যতীত অন্য 1 বা আরও বেশি অক্ষরের সমস্ত অংশ সরিয়ে ফেলতে text। একটি অনলাইন পাইথন ডেমো দেখুন । আপনি "".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))একই ফলাফল পেতে ব্যবহার করতে পারেন।

পাইথনে re, যে কোনও ইউনিকোড চিঠির সাথে মিল রাখতে, কেউ [^\W\d_]নির্মাণ ব্যবহার করতে পারেন ( কোনও ইউনিকোড চিঠি মিলিয়ে দিতে পারেন) ? ) ।

সুতরাং, সমস্ত অক্ষরযুক্ত অক্ষর মুছে ফেলার জন্য, আপনি হয় সমস্ত বর্ণের সাথে মেলে এবং ফলাফলগুলিতে যোগ দিতে পারেন:

result = "".join(re.findall(r'[^\W\d_]', text))

বা, এর সাথে মিলে যাওয়া সমস্ত চরগুলি বাদ দিন [^\W\d_]:

result = re.sub(r'([^\W\d_])|.', r'\1', text, re.DOTALL)

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

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