मुझे एक स्ट्रिंग से सभी विशेष वर्ण, विराम चिह्न और रिक्त स्थान निकालने की आवश्यकता है ताकि मेरे पास केवल अक्षर और संख्याएं हों।
मुझे एक स्ट्रिंग से सभी विशेष वर्ण, विराम चिह्न और रिक्त स्थान निकालने की आवश्यकता है ताकि मेरे पास केवल अक्षर और संख्याएं हों।
जवाबों:
यह रेगेक्स के बिना किया जा सकता है:
>>> 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.
यदि आप रेगेक्स का उपयोग करने पर जोर देते हैं, तो अन्य समाधान ठीक करेंगे। हालाँकि, ध्यान दें कि यदि इसे नियमित अभिव्यक्ति का उपयोग किए बिना किया जा सकता है, तो इसके बारे में जाने का सबसे अच्छा तरीका है।
isalnum()
और regex संस्करणों , और regex एक 50-75% तेज है
यहाँ वर्णों की एक स्ट्रिंग से मिलान करने के लिए एक regex है जो एक अक्षर या संख्या नहीं है:
[^A-Za-z0-9]+
यहाँ रेगेक्स प्रतिस्थापन करने के लिए पायथन कमांड है:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
इसकी दक्षता को थोड़ा सुधारने के लिए एक क्वांटिफायर
[^A-Za-z0-9 ]+
छोटा रास्ता:
import re
cleanString = re.sub('\W+','', string )
यदि आप शब्दों और संख्याओं के बीच रिक्त स्थान चाहते हैं
r'\W+'
- विषय से थोड़ा हटकर (और बहुत पांडित्यपूर्ण) लेकिन मैं एक आदत सुझाता हूं कि सभी रेगेक्स पैटर्न कच्चे तार होते हैं
यह देखने के बाद, मुझे प्रदान किए गए उत्तरों पर विस्तार करने में दिलचस्पी थी, जो यह पता लगाते हैं कि कम से कम समय में निष्पादित होता है, इसलिए मैंने कुछ timeit
उदाहरणों में से दो के साथ प्रस्तावित उत्तरों की जाँच की और उन्हें देखा:
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
'.join(e for e in string if e.isalnum())
string1
- परिणाम: 10.7061979771string2
- परिणाम: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- परिणाम: 7.10785102844string2
- परिणाम: 4.12814903259import re
re.sub('\W+','', string)
string1
- परिणाम: 3.11899876595string2
- परिणाम: 2.78014397621उपरोक्त परिणाम औसत से सबसे कम लौटा परिणाम का एक उत्पाद हैं: repeat(3, 2000000)
उदाहरण 3 उदाहरण 1 से 3x तेज हो सकता है ।
''.join([*filter(str.isalnum, string)])
मुझे लगता है कि सिर्फ 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]
से वैध में अनपैकिंग
map
में filter
, और reduce
बदले में पुनरावृत्ति योग्य वस्तु देता है। अभी भी Python3 + में मैं स्वीकार किए गए उत्तर पर ''.join(filter(str.isalnum, string))
(या उपयोग में शामिल होने के लिए सूची पास करना ''.join([*filter(str.isalnum, string)])
) पसंद करूंगा ।
''.join(filter(str.isalnum, string))
एक सुधार है filter(str.isalnum, string)
। क्या यह वास्तव में पाइथ्रीनिक है (हाँ, आप इसका उपयोग कर सकते हैं) ऐसा करने के लिए?
filter(str.isalnum, string)
python3 में वापसी नहीं स्ट्रिंग के रूप में filter( )
python3 में अजगर -2 के विपरीत तर्क प्रकार के बजाय iterator देता है +।
#!/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
आप और अधिक विशेष वर्ण जोड़ सकते हैं और जिसे '' से बदला जाएगा '' का अर्थ कुछ भी नहीं है अर्थात उन्हें हटा दिया जाएगा।
लगभग हर किसी ने रेगेक्स का उपयोग किया है, मैं हर उस चरित्र को बाहर करने की कोशिश करूंगा जो नहीं है जो कि मैं चाहता, बल्कि स्पष्ट रूप से जो मैं नहीं चाहता हूं उसे स्पष्ट करने के बजाय।
उदाहरण के लिए, यदि मुझे 'ए टू जेड' (ऊपरी और निचले मामले) और संख्याओं के केवल पात्र चाहिए, तो मैं बाकी सब चीजों को बाहर कर दूंगा:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
इसका अर्थ है "प्रत्येक वर्ण को प्रतिस्थापित करें जो एक संख्या नहीं है, या श्रेणी में एक वर्ण 'ए टू जेड' या 'ए टू जेड' एक खाली स्ट्रिंग के साथ है।"
वास्तव में, यदि आप ^
अपने रेगेक्स के पहले स्थान पर विशेष चरित्र सम्मिलित करते हैं, तो आपको नकार मिलेगा।
अतिरिक्त युक्ति: यदि आप भी करने की जरूरत है लोअरकेस परिणाम, आप रेगुलर एक्सप्रेशन से भी तेज और आसान है, जब तक आप किसी भी अपरकेस अब नहीं मिलेगा कर सकते हैं।
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
मान लें कि आप एक regex का उपयोग करना चाहते हैं और आप चाहते हैं / यूनिकोड-संज्ञानात्मक 2.x कोड की आवश्यकता है जो 2to3-ready है:
>>> 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'
>>>
सबसे सामान्य दृष्टिकोण यूनीकोडेड टेबल की 'श्रेणियों' का उपयोग कर रहा है जो हर एक वर्ण को वर्गीकृत करता है। उदाहरण के लिए निम्न कोड केवल उनकी श्रेणी के आधार पर मुद्रण योग्य वर्णों को फ़िल्टर करता है:
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' ')
सभी संबंधित श्रेणियों के लिए ऊपर दिए गए URL को देखें। आप विराम चिह्न श्रेणियों द्वारा निश्चित रूप से फ़िल्टर भी कर सकते हैं।
$
प्रत्येक पंक्ति के अंत में?
string.punctuation में निम्नलिखित वर्ण हैं:
' "# $% & \' () * +, - / :; <=> @ [\] ^ _`।? {|} ~ '
आप रिक्त मानों (प्रतिस्थापन) के लिए विराम चिह्नों को मैप करने के लिए अनुवाद और maketrans फ़ंक्शन का उपयोग कर सकते हैं
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
आउटपुट:
'This is A test'
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"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
और आप अपना परिणाम देखेंगे
'askhnlaskdjalsdk
re
लेकिन इसका कभी उपयोग नहीं किया। आपके replace
मानदंड केवल इस विशिष्ट स्ट्रिंग के लिए काम करते हैं। क्या होगा अगर आपका तार है abc = "askhnl#$%!askdjalsdk"
? मुझे नहीं लगता कि #$%
पैटर्न के अलावा और किसी चीज पर काम किया जाएगा । इसे
विराम चिह्नों, संख्याओं और विशेष वर्णों को हटाना
उदाहरण :-
कोड
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
धन्यवाद :)