2009-12-14 14 views
46

पायथन के string.whitespace महान है पायथन में सफेद स्थान को निकालना Regex के लिए?string.whitespace का उपयोग कर

उदाहरण के लिए, यह चालू करने में सक्षम होना चाहिए: "कृपया \ n मुझे \ x0b चोट न दें।"

"कृपया मुझे चोट न दें।"

मैं शायद एकल रिक्त स्थान रखना चाहता हूं, लेकिन स्ट्रिंग जाने के लिए यह आसान होगा। व्हाइट्स स्पेस [: - 1] मुझे लगता है।

उत्तर

142

वास्तव में उपयोग के इस मामले के लिए एक विशेष दर-मामला शॉर्टकट नहीं है!

यदि आप तर्क के बिना str.split पर कॉल करते हैं, तो यह एकल वर्णों के बजाय व्हाइटस्पेस के रनों पर विभाजित होता है। तो:

>>> ' '.join("Please \n don't \t hurt \x0b me.".split()) 
"Please don't hurt me." 
+5

यह मेरे समाधान से बेहद बेहतर है। मैं भी एक दिन अमर बनने की उम्मीद करता हूं। –

+0

वाह। बहुत शानदार है। मैं जो कर रहा हूं उसके लिए बिल्कुल सही, क्योंकि वे छोटे तार हैं। मुझे आश्चर्य है कि यह बड़े डेटासेट पर कैसे प्रदर्शन करेगा? यह बहुत अच्छा होगा अगर कोई जानता है कि यह आंतरिक रूप से कैसे काम करता है :) – Alex

+0

धन्यवाद, व्हाइटस्पेस के रनों के लिए कोई तर्क नहीं करने के बारे में पता नहीं था। विशाल !! – MattoTodd

1

एक प्रारंभिक बिंदु .. (हालांकि यह मैन्युअल रूप से खाली स्थान के सर्कस कोडांतरण की तुलना में कम नहीं है) ..

>>> from string import whitespace as ws 
>>> import re 

>>> p = re.compile('(%s)' % ('|'.join([c for c in ws]))) 
>>> s = "Please \n don't \t hurt \x0b me." 

>>> p.sub('', s) 
"Pleasedon'thurtme." 

या आप एक की एक अधिकतम करने से व्हाइटस्पेस को कम करना चाहते हैं:

>>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' ']))) 
>>> p2 = re.compile(' +') 
>>> s = "Please \n don't \t hurt \x0b me." 

>>> p2.sub(' ', p1.sub('', s)) 
"Please don't hurt me." 

तीसरा तरीका, अधिक कॉम्पैक्ट:

>>> import string 

>>> s = "Please \n don't \t hurt \x0b me." 
>>> s.translate(None, string.whitespace[]) 
"Pleasedon'thurtme." 

>>> s.translate(None, string.whitespace[:5]) 
"Please don't hurt me." 

>>> ' '.join(s.translate(None, string.whitespace[:5]).split()) 
"Please don't hurt me." 
+0

मूल रूप से यह पहला जवाब था; यह एक अच्छा समाधान था और पाइथन सादगी का अच्छा उपयोग था :) – Alex

2

आप अनुवाद विधि

का उपयोग कर सकते हैं
import string 

s = "Please \n don't \t hurt \x0b me." 
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up 
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down 
>>> s 
"Please don't hurt me." 

और फिर नकली सफेद स्थान को निकालना

s.replace(' ', ' ') 
>>> s 
"Please don't hurt me." 
+0

काम नहीं लग रहा है ... अगर यह हुआ तो अच्छा होगा! – Alex

+0

संपादन देखें। भी, आप किस पायथन संस्करण का उपयोग कर रहे हैं? काम करने के लिए किसी भी तर्क के लिए आपको 2.6 की आवश्यकता नहीं है। –

+0

हाँ, मैं 2.5 का उपयोग कर रहा हूं ... क्या कोई भी विकल्प नहीं है? अन्यथा मुझे अन्य उत्तर का उपयोग करना होगा ... – Alex

13

\s वर्ण वर्ग के साथ क्या गलत है?

>>> import re 

>>> pattern = re.compile(r'\s+') 
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.") 
"Please don't hurt me." 
+0

कुछ भी नहीं, अच्छा समाधान। मुझे लगता है कि .join/split विकल्प हालांकि काफी साफ है, आपको नहीं लगता? :) – Alex

+1

दरअसल। वास्तव में, 'टाइमिट' आपके दिए गए स्ट्रिंग के लिए re.sub() से 6 गुना तेज होने के लिए जुड़ने/विभाजित दिखाता है। – Imran

+0

मुझे लगता है कि एक बार संकलित और 'उप' कई बार पुन: उपयोग किया जाता है यह तेजी से भी हो सकता है –

9

के कुछ उचित मान्यताओं करते हैं:

(1) आप वास्तव में एक भी स्थान के साथ खाली स्थान के वर्णों के किसी भी रन बदलना चाहते हैं (एक रन लंबाई 1 या अधिक से अधिक है)।

(2) आप एक ही कोड को पायथन 2.X के तहत यूनिकोड ऑब्जेक्ट्स के साथ न्यूनतम परिवर्तनों के साथ काम करना चाहते हैं।

(3) आप चीजें हैं जो डॉक्स

में गारंटी नहीं दी जाती ग्रहण करने के लिए अपने कोड नहीं करना चाहते

(4) आप अजगर 3.X str वस्तुओं के साथ कम से कम परिवर्तन के साथ काम करने के लिए एक ही कोड चाहते हैं।

वर्तमान में चयनित जवाब इन समस्याओं है:

(क) " " * 3" " * 2 अर्थात, आदि रिक्त स्थान के लिए यह डुप्लिकेट रिक्त स्थान निकाल देता है लेकिन तीन प्रतियों नहीं, चार प्रतियों बदल जाता है।[विफल रहता आवश्यकता 1]

(ख) में परिवर्तन "foo\tbar\tzot""foobarzot" करने के लिए [विफल रहता आवश्यकता 1]

(ग) जब एक यूनिकोड वस्तु खिलाया, हो जाता है TypeError: translate() takes exactly one argument (2 given) [विफल रहता आवश्यकता 2]

(घ) string.whitespace[:-1] का उपयोग करता है [आवश्यकता 3 विफल रहता है; string.whitespace में वर्णों का क्रम गारंटी नहीं है]

(ई) string.whitespace[:-1] का उपयोग करता है [आवश्यकता 4 विफल रहता है; पायथन 2.X में, string.whitespace '\t\n\x0b\x0c\r ' है; पायथन 3.X में, यह '\ t \ n \ r \ x0b \ x0c']

" ".join(s.split()) उत्तर और re.sub(r"\s+", " ", s) उत्तर इन समस्याओं को नहीं है।

+0

अरे, आप कुछ महान अंक उठाते हैं। मेरे लिए, '.join (s.split()) "foo \ tbar \ tzot" परीक्षण पर काम करता है! मेरा मतलब है, मूल जवाब मेरे लिए काम करता था, लेकिन ऐसा इसलिए है क्योंकि मुझे ऐसे अजीब तारों की उम्मीद नहीं है। हालांकि इससे निपटने वाला कुछ अच्छा होगा। मैंने अभी "foo \ tbar \ tzot" के साथ सब का परीक्षण किया है और यह काम करता है ... इसलिए मुझे लगता है कि मैं बस अपनी सादगी के कारण 'join (s.split()) संस्करण चुन रहा हूं और बिना काम करने में सक्षम हूं पुनः मॉड्यूल आयात। इसके अलावा मेरे डेटासेट छोटे हैं, इसलिए यदि कोई था तो मैं प्रदर्शन समस्याओं के बारे में चिंतित नहीं हूं। – Alex

संबंधित मुद्दे