স্ট্রিং থেকে সমস্ত বিশেষ অক্ষর, বিরামচিহ্ন এবং স্পেসগুলি সরিয়ে ফেলুন


236

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

উত্তর:


351

এটি রেজেক্স ছাড়াই করা যেতে পারে:

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'

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

S.isalnum() -> bool

Return True if all characters in S are alphanumeric
and there is at least one character in S, False otherwise.

আপনি যদি রেজেক্স ব্যবহার করার জন্য জেদ করেন তবে অন্যান্য সমাধানগুলি ঠিকঠাক করবে। তবে মনে রাখবেন যে এটি যদি নিয়মিত এক্সপ্রেশন না ব্যবহার করে করা যায়, তবে এটি সবচেয়ে ভাল উপায়।


7
থাম্বের নিয়ম হিসাবে রেজেক্স ব্যবহার না করার কারণ কী?
ক্রিস ডাট্রো

@ ক্রিসডুড্রো রেজেক্সটি পাইথন স্ট্রিং বিল্ট-ইন ফাংশনগুলির চেয়ে ধীরে ধীরে
ডিয়েগো নাভারো

এটি কেবল তখনই কাজ করে যখন স্ট্রিংটি ইউনিকোডে থাকে । অন্যথায় এটি অভিযোগ করে যে 'আরআর' অবজেক্টের 'ইসলনাম' 'ইসনুমুরিক' ইত্যাদি নেই।
নিওজি

10
@ ডিগোনাভারো এটি সত্য নয়, বাদ দিয়ে আমি উভয় isalnum()এবং রেইগেক্স সংস্করণকেই বেঞ্চমার্ক করেছি এবং
রেইজেক্সটি

2
অতিরিক্তভাবে: "8-বিট স্ট্রিংয়ের জন্য, এই পদ্ধতিটি লোকাল-নির্ভর" " এইভাবে রেজেক্স বিকল্পটি কঠোরভাবে ভাল!
আন্তি হাপালা

232

একটি অক্ষর বা সংখ্যা নয় এমন অক্ষরের একটি স্ট্রিংয়ের সাথে মিল দেওয়ার জন্য এখানে একটি রেজেক্স রয়েছে:

[^A-Za-z0-9]+

একটি রেজেক্স প্রতিস্থাপন করার জন্য পাইথন কমান্ডটি এখানে:

re.sub('[^A-Za-z0-9]+', '', mystring)

10
KISS: এটি সরল বোকা রাখুন! এটি অ-রেজেক্স সমাধানগুলির চেয়ে ছোট এবং আরও সহজে পড়া সহজ এবং তত দ্রুতও হতে পারে। (তবে, +এর দক্ষতা কিছুটা বাড়ানোর জন্য আমি একটি কোয়ান্টিফায়ার যুক্ত করব ))
রিজার্জনার

1
এটি "দুর্দান্ত জায়গা" -> "গ্রেটপ্লেস" শব্দের মধ্যবর্তী স্থানগুলিও সরিয়ে দেয়। কীভাবে এড়ানো যায়?
রেহান_ম্ন

5
@ রিহান_এমন কেবলমাত্র রেইগেক্সে একটি স্থান যুক্ত করুন, তাই এটি হয়ে যায়:[^A-Za-z0-9 ]+
অস্ট্রুন

1
@ অ্যান্ডি-হোয়াইট আপনি দয়া করে উত্তরে রেজিএক্সে স্থান যুক্ত করতে পারেন? স্থান কোনও বিশেষ চরিত্র নয় ...
ইউফোস

3
আমি অনুমান করি যে এটি অন্যান্য ভাষায় যেমন á , ö , ñ ইত্যাদি পরিবর্তিত চরিত্রের সাথে কাজ করে না আমি ঠিক আছি? যদি তা হয়, তবে এটির জন্য এটি কীভাবে রেজিএক্স হবে?
হুলু ভিকা 14

50

খাটো উপায়:

import re
cleanString = re.sub('\W+','', string )

আপনি যদি শব্দ এবং সংখ্যার মধ্যে ফাঁক চান তবে '' এর সাথে ''


3
_ \ ডাব্লুতে এবং এই প্রশ্নের প্রসঙ্গে একটি বিশেষ চরিত্র ব্যতীত
ক্কুরিয়ান

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

1
r'\W+'- সামান্য অফ টপিক (এবং খুব পেডেন্টিক) তবে আমি একটি অভ্যাসের পরামর্শ দিচ্ছি যে সমস্ত রেজেক্স প্যাটার্নগুলি কাঁচা স্ট্রিং হোক
বব স্টেইন

2
এই পদ্ধতিটি আন্ডারস্কোর (_) কে একটি বিশেষ চরিত্র হিসাবে বিবেচনা করে না।
মোঃ সাব্বির আহমেদ

30

এটি দেখার পরে, আমি স্বল্প সময়ের মধ্যে কোনটি সম্পাদন করে তা সরবরাহ করে জবাবগুলি প্রসারিত করতে আগ্রহী ছিলাম, তাই আমি গিয়ে timeitদুটি প্রস্তাবিত উত্তরগুলির সাথে দুটি উদাহরণের সাথে পরীক্ষা করেছি:

  • string1 = 'Special $#! characters spaces 888323'
  • string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'

উদাহরণ 1

'.join(e for e in string if e.isalnum())

  • string1 - ফলাফল: 10.7061979771
  • string2 - ফলাফল: 7.78372597694

উদাহরণ 2

import re re.sub('[^A-Za-z0-9]+', '', string)

  • string1 - ফলাফল: 7.10785102844
  • string2 - ফলাফল: 4.12814903259

উদাহরণ 3

import re re.sub('\W+','', string)

  • string1 - ফলাফল: 3.11899876595
  • string2 - ফলাফল: 2.78014397621

উপরের ফলাফলগুলি সর্বনিম্ন থেকে নিম্নতম প্রাপ্ত ফলাফলের একটি পণ্য: repeat(3, 2000000)

উদাহরণ 3 উদাহরণ 1 এর চেয়ে 3x দ্রুত হতে পারে ।


@ ক্কুরিয়ান আপনি যদি আমার উত্তরের শুরুটি পড়ে থাকেন তবে এটি কেবল উপরের প্রস্তাবিত সমাধানগুলির তুলনা। আপনি উদ্ভব উত্তরে মন্তব্য করতে চাইবেন ... stackoverflow.com/a/25183802/2560922
mbeacom

ওহ, আমি দেখতে পাচ্ছি আপনি কোথায় যাচ্ছেন। সম্পন্ন!
কুকুরিয়ান

1
বড় কর্পাসের সাথে ডিল করার সময় উদাহরণ 3 বিবেচনা করতে হবে।
নীলেশ পাঠক

বৈধ! লক্ষ করার জন্য ধন্যবাদ।
mbeacom

আপনি কি আমার উত্তরটি তুলনা করতে পারেন''.join([*filter(str.isalnum, string)])
গ্রিজেশ চৌহান

22

পাইথন ২। *

আমি মনে করি শুধু filter(str.isalnum, string)কাজ করে

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

পাইথন ৩। *

পাইথন 3-এ, filter( )ফাংশনটি একটি সংযোজনযোগ্য বস্তুটি ফেরত দেবে (উপরে বর্ণিত স্ট্রিংয়ের পরিবর্তে)। সংক্ষিপ্ত বিবরণ থেকে স্ট্রিং পেতে একজনকে ফিরে যেতে হবে:

''.join(filter(str.isalnum, string)) 

বা listযোগদানের ব্যবহারে পাস ( নিশ্চিত নয় তবে কিছুটা দ্রুত হতে পারে )

''.join([*filter(str.isalnum, string)])

দ্রষ্টব্য: পাইথন> = 3.5[*args] থেকে বৈধ ইনপ্যাকিং


4
অ্যালেক্সি সঠিক, পাইথন 3-এ map, filterএবং reduce পরিবর্তে ইয়ারটেবল অবজেক্টটি প্রদান করে। তবুও পাইথন 3 + এ আমি গৃহীত উত্তরের চেয়ে বেশি পছন্দ করব ''.join(filter(str.isalnum, string)) (বা যোগদানের তালিকাতে পাস করতে ''.join([*filter(str.isalnum, string)])))
গ্রিজেশ চৌহান

আমি নিশ্চিত নই যে কমপক্ষে পড়তে হবে ''.join(filter(str.isalnum, string))improvement filter(str.isalnum, string)এটি কি আসলেই পাইথারনিক (হ্যাঁ, আপনি এটি ব্যবহার করতে পারেন) এটি করার উপায়?
দ্য প্রলেটারিয়েট

1
@TheProletariat বিন্দু মাত্রfilter(str.isalnum, string) Python3 ফিরে আসতে না স্ট্রিং হিসেবে filter( )Python3 মধ্যে পাইথন-2 অসদৃশ যুক্তি টাইপ বদলে পুনরুক্তিকারীর ফেরৎ + +।
Grijesh চৌহান

@ গ্রিজেশচৌহান, আমি মনে করি আপনার পাইথন 2 এবং পাইথন 3 সুপারিশ দুটি অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি আপডেট করা উচিত।
mwfearnley

18
#!/usr/bin/python
import re

strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr

আপনি আরও বিশেষ চরিত্র যুক্ত করতে পারেন এবং এর পরিবর্তে '' এর অর্থ কিছুই হবে না সেগুলি মুছে ফেলা হবে।


16

ভিন্নভাবে চেয়ে বাকিদের Regex ব্যবহার করেছিল আমি প্রতি চরিত্র বাদ দেওয়ার চেষ্টা করবে না পরিবর্তে স্পষ্টভাবে enumerating আমি না চান, আমি কি চাই।

উদাহরণস্বরূপ, আমি যদি 'এ টু জেড' (উচ্চ এবং নিম্ন কেস) এবং সংখ্যাগুলি থেকে কেবল অক্ষর চাই, তবে আমি অন্য সমস্ত কিছু বাদ দেব:

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

এর অর্থ "শূন্য স্ট্রিং সহ প্রতিটি অক্ষর যা একটি সংখ্যা নয়, বা 'a to z' বা" A to Z "রেঞ্জের একটি অক্ষরকে প্রতিস্থাপন করবে"।

আসলে, আপনি যদি ^আপনার রেজেক্সের প্রথম স্থানে বিশেষ চরিত্রটি সন্নিবেশ করান তবে আপনি প্রত্যাখ্যান পাবেন।

অতিরিক্ত টিপ: আপনার যদি ফলাফলটি ছোট করার প্রয়োজন হয় তবে আপনি রেজিজকে আরও দ্রুত এবং সহজ করে তুলতে পারবেন, যতক্ষণ না আপনি এখন পর্যন্ত কোনও বড় হাতের অক্ষর খুঁজে পাবেন না।

import re
s = re.sub(r"[^a-z0-9]","",s.lower())

9

ধরে নিই যে আপনি একটি রেজেক্স ব্যবহার করতে চান এবং আপনার ইউনিকোড-কগনিজেন্ট ২.x কোডটি প্রয়োজন যা 2to3- এর জন্য প্রস্তুত:

>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>


6

সর্বাধিক জেনারিক পন্থাটি ইউনিকোডেটাটা টেবিলের 'বিভাগগুলি' ব্যবহার করে যা প্রতিটি একক চরিত্রকে শ্রেণিবদ্ধ করে। যেমন নীচের কোডগুলি কেবল তাদের বিভাগের ভিত্তিতে মুদ্রণযোগ্য অক্ষরগুলি ফিল্টার করে:

import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien

PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))

def filter_non_printable(s):
    result = []
    ws_last = False
    for c in s:
        c = unicodedata.category(c) in PRINTABLE and c or u'#'
        result.append(c)
    return u''.join(result).replace(u'#', u' ')

সমস্ত সম্পর্কিত বিভাগের জন্য উপরে প্রদত্ত ইউআরএলটি দেখুন। বিরামচিহ্ন বিভাগ দ্বারা আপনি অবশ্যই ফিল্টার করতে পারেন।


$প্রতিটি লাইনের শেষে কী আছে ?
জন মাচিন 20

যদি এটি অনুলিপি এবং পেস্ট ইস্যু হয়, আপনি কি এটি ঠিক করতে হবে?
ওলি

5

স্ট্রিং.পঞ্চকুয়েশনে নিম্নলিখিত অক্ষর রয়েছে:

' "# $% & \!' () * + - / :; <=> @ [\] ^: _ '।? {|} ~'

খালি মানগুলিতে বিরামচিহ্নগুলি মানচিত্র করতে আপনি অনুবাদ এবং মেকট্রান্স ফাংশন ব্যবহার করতে পারেন (প্রতিস্থাপন)

import string

'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))

আউটপুট:

'This is A test'

4

অনুবাদ ব্যবহার করুন:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')

ক্যাভেট: কেবলমাত্র এসকি স্ট্রিংয়ের উপর কাজ করে।


সংস্করণ পার্থক্য? আমি পাই TypeError: translate() takes exactly one argument (2 given)3.4
ম্যাট উইলকি

1
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the 

ডাবল উদ্ধৃতি হিসাবে একই। ""

# if we need to count the word python that ends with or without ',' or '.' at end

count = 0
for i in text:
    if i.endswith("."):
        text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
    count += 1
print("The count of Python : ", text.count("python"))

0
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

এবং আপনি আপনার ফলাফল হিসাবে দেখতে পাবেন

'askhnlaskdjalsdk


4
অপেক্ষা করুন .... আপনি আমদানি করেছেন reতবে এটি কখনও ব্যবহার করেন নি। আপনার replaceমানদণ্ড কেবল এই নির্দিষ্ট স্ট্রিংয়ের জন্য কাজ করে। যদি আপনার স্ট্রিং হয় abc = "askhnl#$%!askdjalsdk"? আমি মনে করি না #$%প্যাটার্ন ব্যতীত অন্য কোনও কাজ করবে । এটি টুইট করতে পারে
জেচাও

0

বিরামচিহ্নগুলি, সংখ্যা এবং বিশেষ অক্ষর মুছে ফেলা হচ্ছে

উদাহরণ: -

এখানে চিত্র বর্ণনা লিখুন

কোড

combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ") 

ফলাফল:- এখানে চিত্র বর্ণনা লিখুন

ধন্যবাদ :)

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