स्ट्रिंग से सभी विशेष वर्ण, विराम चिह्न और रिक्त स्थान निकालें


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
अंगूठा नियम के रूप में रेगेक्स का उपयोग नहीं करने का क्या कारण है?
क्रिस डट्रो

@ क्रिसहुट्रो रेगेक्स पायथन स्ट्रिंग में निर्मित कार्यों की तुलना में धीमा हैं
डिएगो

यह केवल तभी काम करता है जब स्ट्रिंग यूनिकोड में हो । अन्यथा यह शिकायत करता है कि 'str' ऑब्जेक्ट में कोई विशेषता 'isalnum' 'isnumeric' इत्यादि नहीं है।
नवजी

10
@DiegoNavarro को छोड़कर यह सच नहीं है, मैंने दोनों को बेंचमार्क किया isalnum() और regex संस्करणों , और regex एक 50-75% तेज है
फ्रांसिस्को कौजो

2
अतिरिक्त रूप से: "8-बिट स्ट्रिंग्स के लिए, यह विधि स्थानीय-निर्भर है।" इस प्रकार रेगेक्स विकल्प सख्ती से बेहतर है!
एंटटी हवाला

232

यहाँ वर्णों की एक स्ट्रिंग से मिलान करने के लिए एक regex है जो एक अक्षर या संख्या नहीं है:

[^A-Za-z0-9]+

यहाँ रेगेक्स प्रतिस्थापन करने के लिए पायथन कमांड है:

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

10
KISS: यह सरल बेवकूफ रखें! यह गैर-रेगेक्स समाधानों की तुलना में पढ़ने में छोटा और बहुत आसान है और साथ ही तेज भी हो सकता है। (हालांकि, मैं +इसकी दक्षता को थोड़ा सुधारने के लिए एक क्वांटिफायर
जोड़ूंगा

1
यह शब्दों के बीच के रिक्त स्थान, "महान स्थान" -> "महान स्थान" को भी हटा देता है। इससे कैसे बचा जाए?
रेहान_मं।

5
@ रीहान_मन बस रीगेक्स के लिए एक स्थान जोड़ते हैं, इसलिए यह बन जाता है:[^A-Za-z0-9 ]+
ऑस्ट्रोऑन

1
@ -y- व्हाइट क्या आप उत्तर में रेगेक्स में स्थान जोड़ सकते हैं? स्पेस कोई खास कैरेक्टर नहीं है ...
Ufos

3
मुझे लगता है कि यह अन्य भाषाओं, जैसे á , ö , ñ , आदि में संशोधित चरित्र के साथ काम नहीं करता है क्या मैं सही हूं? यदि हां, तो इसके लिए रेगेक्स कैसे होगा?
हुलु वीका

50

छोटा रास्ता:

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

यदि आप शब्दों और संख्याओं के बीच रिक्त स्थान चाहते हैं


3
सिवाय इसके कि _ in \ w है और इस प्रश्न के संदर्भ में एक विशेष चरित्र है।
कुकुरिया

संदर्भ पर निर्भर करता है - अंडरस्कोर फिल्नाम और अन्य पहचानकर्ताओं के लिए बहुत उपयोगी है, इस बात के लिए कि मैं इसे एक विशेष चरित्र के रूप में नहीं मानता हूं, बल्कि एक स्वच्छता स्थान के रूप में हूं। मैं आमतौर पर इस पद्धति का उपयोग करता हूं।
इकलौता

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 तेज हो सकता है ।


@kkurian यदि आप मेरे उत्तर की शुरुआत को पढ़ते हैं, तो यह पहले से प्रस्तावित समाधानों की तुलना मात्र है। आप मूल उत्तर पर टिप्पणी करना चाहते हैं ... stackoverflow.com/a/25183802/2560922
mbeacom

ओह, मैं देख रहा हूँ कि आप इसके साथ कहाँ जा रहे हैं। किया हुआ!
कुकुरिया

1
उदाहरण 3 पर विचार करना चाहिए, जब बड़े कॉर्पस के साथ काम करना।
हर्ष निलाथ पथ

मान्य! ध्यान देने के लिए धन्यवाद।
mbeacom 19

क्या आप मेरे जवाब की तुलना कर सकते हैं''.join([*filter(str.isalnum, string)])
ब्रिजेश चौहान

22

अजगर 2. *

मुझे लगता है कि सिर्फ filter(str.isalnum, string)काम करता है

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

अजगर 3. *

पायथन 3 में, filter( )फ़ंक्शन एक पुनरावृत्त वस्तु (स्ट्रिंग के बजाय ऊपर के विपरीत) लौटाएगा। पुनरावृत्ति से एक स्ट्रिंग प्राप्त करने के लिए वापस शामिल होना होगा:

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

या listज्वाइन यूज़ में पास होने के लिए ( निश्चित नहीं है लेकिन थोड़ा तेज़ हो सकता है )

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

नोट: पायथन> = 3.5[*args] से वैध में अनपैकिंग


4
@Alexey सही, python3 mapमें filter, और reduce बदले में पुनरावृत्ति योग्य वस्तु देता है। अभी भी Python3 + में मैं स्वीकार किए गए उत्तर पर ''.join(filter(str.isalnum, string)) (या उपयोग में शामिल होने के लिए सूची पास करना ''.join([*filter(str.isalnum, string)])) पसंद करूंगा ।
बृजेश चौहान

मुझे यकीन नहीं है कि कम से कम पढ़ने के लिए ''.join(filter(str.isalnum, string))एक सुधार है filter(str.isalnum, string)। क्या यह वास्तव में पाइथ्रीनिक है (हाँ, आप इसका उपयोग कर सकते हैं) ऐसा करने के लिए?
theProletariat

1
@TheProletariat बिंदु है सिर्फfilter(str.isalnum, string) python3 में वापसी नहीं स्ट्रिंग के रूप में filter( )python3 में अजगर -2 के विपरीत तर्क प्रकार के बजाय iterator देता है +।
Grijesh चौहान

@GrijeshChauhan, मुझे लगता है कि आपको अपने Python2 और Python3 दोनों सिफारिशों को शामिल करने के लिए अपने उत्तर को अपडेट करना चाहिए।
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

लगभग हर किसी ने रेगेक्स का उपयोग किया है, मैं हर उस चरित्र को बाहर करने की कोशिश करूंगा जो नहीं है जो कि मैं चाहता, बल्कि स्पष्ट रूप से जो मैं नहीं चाहता हूं उसे स्पष्ट करने के बजाय।

उदाहरण के लिए, यदि मुझे 'ए टू जेड' (ऊपरी और निचले मामले) और संख्याओं के केवल पात्र चाहिए, तो मैं बाकी सब चीजों को बाहर कर दूंगा:

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

इसका अर्थ है "प्रत्येक वर्ण को प्रतिस्थापित करें जो एक संख्या नहीं है, या श्रेणी में एक वर्ण 'ए टू जेड' या 'ए टू जेड' एक खाली स्ट्रिंग के साथ है।"

वास्तव में, यदि आप ^अपने रेगेक्स के पहले स्थान पर विशेष चरित्र सम्मिलित करते हैं, तो आपको नकार मिलेगा।

अतिरिक्त युक्ति: यदि आप भी करने की जरूरत है लोअरकेस परिणाम, आप रेगुलर एक्सप्रेशन से भी तेज और आसान है, जब तक आप किसी भी अपरकेस अब नहीं मिलेगा कर सकते हैं।

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

9

मान लें कि आप एक 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'
>>>


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' ')

सभी संबंधित श्रेणियों के लिए ऊपर दिए गए URL को देखें। आप विराम चिह्न श्रेणियों द्वारा निश्चित रूप से फ़िल्टर भी कर सकते हैं।


क्या साथ है $प्रत्येक पंक्ति के अंत में?
जॉन माकिन

यदि यह कॉपी और पेस्ट मुद्दा है, तो क्या आपको इसे ठीक करना चाहिए?
ओली

5

string.punctuation में निम्नलिखित वर्ण हैं:

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

आप रिक्त मानों (प्रतिस्थापन) के लिए विराम चिह्नों को मैप करने के लिए अनुवाद और maketrans फ़ंक्शन का उपयोग कर सकते हैं

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)py3.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#]", " ") 

परिणाम:- यहां छवि विवरण दर्ज करें

धन्यवाद :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.