python - পাইথন একটি স্ট্রিং থেকে বিরামচিহ্ন ফালা শ্রেষ্ঠ উপায়




string punctuation (16)

Python 3 str বা Python 2 unicode মানগুলির জন্য, str.translate() শুধুমাত্র একটি অভিধান নেয়; কোডপয়েন্টগুলি (পূর্ণসংখ্যা) যে ম্যাপিংয়ে দেখানো হয় এবং যেকোনটিকে ম্যাপ করা কিছু মুছে ফেলা হয়।

তারপর (কিছু?) বিরামচিহ্ন মুছে ফেলার জন্য, ব্যবহার করুন:

import string

remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)

dict.fromkeys() ক্লাস পদ্ধতিটি ম্যাপিং তৈরি করতে তুচ্ছ করে তোলে, কীগুলির ক্রম অনুসারে None মানকে সেট করে না।

সমস্ত বিরামচিহ্ন মুছে ফেলার জন্য, শুধুমাত্র ASCII বিরামচিহ্ন নয়, আপনার টেবিলটি আরও বড় হতে হবে; জেএফ সেবাস্তিয়ানের উত্তরটি দেখুন (পাইথন 3 সংস্করণ):

import unicodedata
import sys

remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
                                 if unicodedata.category(chr(i)).startswith('P'))

এটি চেয়ে সহজ উপায় হওয়া উচিত বলে মনে হচ্ছে:

import string
s = "string. With. Punctuation?" # Sample string 
out = s.translate(string.maketrans("",""), string.punctuation)

সেখানে কি আছে?


অপরিহার্যভাবে সহজ নয়, তবে একটি ভিন্ন উপায়, যদি আপনি পুনরায় পরিবারের সাথে আরও পরিচিত হন।

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)

আমি এখনো এই উত্তরটি দেখিনি। শুধু একটি regex ব্যবহার করুন; এটি শব্দ অক্ষর ( \w ) এবং সংখ্যা অক্ষর ( \d ) ছাড়া সমস্ত অক্ষরগুলি মুছে ফেলে, একটি সাদা জায়গা চরিত্র ( \s ) অনুসরণ করে:

import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(ur'[^\w\d\s]+', '', s)

আমি সাধারণত এই মত কিছু ব্যবহার:

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

একটি দক্ষতা দৃষ্টিকোণ থেকে, আপনি বীট যাচ্ছে না

s.translate(None, string.punctuation)

এটি একটি অনুসন্ধান টেবিলের সাথে C- র মধ্যে কাঁচা স্ট্রিং ক্রিয়াকলাপগুলি সম্পাদন করছে - এটি এমন কিছু না যা এটি বীট করবে কিন্তু আপনার নিজস্ব সি কোড লিখবে।

যদি গতি একটি উদ্বেগ না হয়, অন্য একটি বিকল্প যদিও:

exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)

এটি প্রতিটি গৃহস্থালি সহ s.replace এর চেয়ে দ্রুত, তবে রেজেক্স বা স্ট্রিং.ট্রান্সলেট হিসাবে অ-বিশুদ্ধ পাইথন পন্থাগুলি সম্পাদন করবে না, যেমন আপনি নীচের সময় থেকে দেখতে পারেন। এই ধরনের সমস্যার জন্য, এটি যত কম সম্ভব ততটুকু বন্ধ করে দেয়।

সময় কোড

import re, string, timeit

s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))

def test_set(s):
    return ''.join(ch for ch in s if ch not in exclude)

def test_re(s):  # From Vinko's solution, with fix.
    return regex.sub('', s)

def test_trans(s):
    return s.translate(table, string.punctuation)

def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s

print "sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)

এই নিম্নলিখিত ফলাফল দেয়:

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

এখানে Python 3.5 এর জন্য একটি এক-মাছ ধরার নৌকা রয়েছে:

import string
"l*ots! o(f. [email protected])n[c}t]u[a'ti\"on#$^?/".translate(str.maketrans({a:None for a in string.punctuation}))

এখানে লেখা একটি ফাংশন। এটি খুব কার্যকর নয়, তবে এটি সহজ এবং আপনি যে কোনও বিরামচিহ্ন যুক্ত বা সরাতে পারেন:

def stripPunc(wordList):
    """Strips punctuation from list of words"""
    puncList = [".",";",":","!","?","/","\\",",","#","@","$","&",")","(","\""]
    for punc in puncList:
        for word in wordList:
            wordList=[word.replace(punc,'') for word in wordList]
    return wordList

এটি সর্বোত্তম সমাধান হতে পারে না তবে আমি এটি কিভাবে করি।

import string
f = lambda x: ''.join([i for i in x if i not in string.punctuation])

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

table = str.maketrans({key: None for key in string.punctuation})

বনাম

table = str.maketrans('', '', string.punctuation)

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

এটি সম্পূর্ণ কোড:

import re, string, timeit

s = "string. With. Punctuation"


def test_set(s):
    exclude = set(string.punctuation)
    return ''.join(ch for ch in s if ch not in exclude)


def test_set2(s):
    _punctuation = set(string.punctuation)
    for punct in set(s).intersection(_punctuation):
        s = s.replace(punct, ' ')
    return ' '.join(s.split())


def test_re(s):  # From Vinko's solution, with fix.
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    return regex.sub('', s)


def test_trans(s):
    table = str.maketrans({key: None for key in string.punctuation})
    return s.translate(table)


def test_trans2(s):
    table = str.maketrans('', '', string.punctuation)
    return(s.translate(table))


def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s


print("sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000))
print("sets2      :",timeit.Timer('f(s)', 'from __main__ import s,test_set2 as f').timeit(1000000))
print("regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000))
print("translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000))
print("translate2 :",timeit.Timer('f(s)', 'from __main__ import s,test_trans2 as f').timeit(1000000))
print("replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000))

এই আমার ফলাফল:

sets      : 3.1830138750374317
sets2      : 2.189873124472797
regex     : 7.142953420989215
translate : 4.243278483860195
translate2 : 2.427158243022859
replace   : 4.579746678471565

নিয়মিত এক্সপ্রেশন যথেষ্ট সহজ, যদি আপনি তাদের জানেন।

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)

উপরের কোডে, আমরা খালি স্ট্রিং সহ সমস্ত non [আলফানিউমেরিক অক্ষর (\ w) এবং স্পেস (\ গুলি)] প্রতিস্থাপন করছি (re.sub)।
তাই। এবং ? রেজেক্টের মাধ্যমে চলমান পরিবর্তনশীল চলাকালীন বিরাম-চিহ্ন উপস্থিত হবে না।


ব্যবহারের সুবিধার জন্য, আমি পাইথন 2 এবং পাইথন 3 উভয়ের স্ট্রিং থেকে বিরাম বিরামচিহ্নের নোটটি সমষ্টিভুক্ত করেছি। বিস্তারিত বিবরণের জন্য দয়া করে অন্যান্য উত্তর পড়ুন।

পাইথন ২

import string

s = "string. With. Punctuation?"
table = string.maketrans("","")
new_s = s.translate(table, string.punctuation)      # Output: string without punctuation

পাইথন 3

import string

s = "string. With. Punctuation?"
table = str.maketrans({key: None for key in string.punctuation})
new_s = s.translate(table)                          # Output: string without punctuation

here. দেখা হিসাবে, regex ফাংশন ব্যবহার করে অনুসন্ধান এবং প্রতিস্থাপন here. । যদি আপনি বারবার অপারেশনটি সঞ্চালন করতে চান তবে আপনি রেজেক্স প্যাটার্ন (আপনার বিরামচিহ্ন) এর একটি সংকলিত অনুলিপি রাখতে পারেন যা কিছুটা গতিতে বাড়িয়ে দেবে।


string.punctuation সাধারণত বিরাট বিশ্বের ব্যবহার করা হয় যে বিরাম চিহ্ন লোড মিস। কিভাবে একটি সমাধান যে AS-ASCII বিরামচিহ্ন জন্য কাজ করে?

import regex
s = u"string. With. Some・Really Weird、Non?ASCII。 「(Punctuation)」?"
remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
remove.sub(u" ", s).strip()

ব্যক্তিগতভাবে, আমি পাইথনে একটি স্ট্রিং থেকে বিরামচিহ্ন অপসারণ করার সেরা উপায় কারণ বিশ্বাস করি:

  • এটি সমস্ত ইউনিকোড বিরামচিহ্ন মুছে ফেলে
  • এটি সহজে সংশোধনযোগ্য, উদাহরণস্বরূপ আপনি যদি বিরামচিহ্নটি সরাতে চান তবে \{S} মুছে ফেলতে পারেন তবে $ চিহ্নের মতো চিহ্ন রাখুন।
  • আপনি যা রাখতে চান এবং আপনি যা মুছে ফেলতে চান সে সম্পর্কে সত্যিই নির্দিষ্ট পেতে পারেন, উদাহরণস্বরূপ \{Pd} শুধুমাত্র ড্যাশগুলি সরিয়ে দেবে।
  • এই regex এছাড়াও হোয়াইটস্পেস স্বাভাবিক। এটি চমৎকার, একক স্পেসগুলিতে ট্যাব, ক্যারিয়ার আয় এবং অন্যান্য অদ্ভুততা মানচিত্র করে।

এটি ইউনিকোড চরিত্র বৈশিষ্ট্যগুলি ব্যবহার করে, যা আপনি উইকিপিডিয়া সম্পর্কে আরও পড়তে পারেন


#FIRST METHOD
#Storing all punctuations in a variable    
punctuation='!?,.:;"\')(_-'
newstring='' #Creating empty string
word=raw_input("Enter string: ")
for i in word:
     if(i not in punctuation):
                  newstring+=i
print "The string without punctuation is",newstring

#SECOND METHOD
word=raw_input("Enter string: ")
punctuation='!?,.:;"\')(_-'
newstring=word.translate(None,punctuation)
print "The string without punctuation is",newstring


#Output for both methods
Enter string: hello! welcome -to_python(programming.language)??,
The string without punctuation is: hello welcome topythonprogramminglanguage

with open('one.txt','r')as myFile:

    str1=myFile.read()

    print(str1)


    punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"] 

for i in punctuation:

        str1 = str1.replace(i," ") 
        myList=[]
        myList.extend(str1.split(" "))
print (str1) 
for i in myList:

    print(i,end='\n')
    print ("____________")

myString.translate(None, string.punctuation)





punctuation