मैं स्ट्रिंग से संख्याओं को छोड़कर सभी वर्णों को कैसे निकाल सकता हूं?
मैं स्ट्रिंग से संख्याओं को छोड़कर सभी वर्णों को कैसे निकाल सकता हूं?
जवाबों:
पाइथन 2. * में, अब तक का सबसे तेज़ तरीका है .translate:
>>> x='aaa12333bb445bb54b5b52'
>>> import string
>>> all=string.maketrans('','')
>>> nodigs=all.translate(all, string.digits)
>>> x.translate(all, nodigs)
'1233344554552'
>>>
string.maketransएक अनुवाद तालिका (लंबाई 256 की एक स्ट्रिंग) बनाती है, जो इस मामले में वैसी ही है ''.join(chr(x) for x in range(256))(बनाने में तेज़; ;-) .translateअनुवाद तालिका लागू करता है (जो allअनिवार्य रूप से पहचान के बाद से अप्रासंगिक है) और दूसरे तर्क में मौजूद वर्णों को हटा देता है - प्रमुख भाग।
.translateयूनिकोड स्ट्रिंग्स पर बहुत अलग तरीके से काम करता है (और पायथन 3 में तार - मैं यह निर्दिष्ट करना चाहता हूं कि पायथन का कौन सा प्रमुख रिलीज ब्याज का है!) - यह काफी सरल नहीं है, यह बहुत तेजी से नहीं, हालांकि अभी भी काफी उपयोगी है।
2. * पर वापस, प्रदर्शन अंतर प्रभावशाली है ...:
$ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)'
1000000 loops, best of 3: 1.04 usec per loop
$ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 7.9 usec per loop
7-8 बार चीजों को गति देना शायद ही मूंगफली है, इसलिए translateविधि अच्छी तरह से जानने और उपयोग करने लायक है। अन्य लोकप्रिय गैर-आरई दृष्टिकोण ...:
$ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())'
100000 loops, best of 3: 11.5 usec per loop
आरई की तुलना में 50% धीमा है, इसलिए .translateदृष्टिकोण इसे परिमाण के एक क्रम से अधिक धड़कता है।
पायथन 3 में, या यूनिकोड के लिए, आपको .translateएक मैपिंग (अध्यादेशों के साथ, वर्णों को सीधे नहीं, कुंजी के रूप में) पास करने की आवश्यकता होती है , Noneजो आप हटाना चाहते हैं। "कुछ लेकिन" कुछ वर्णों को हटाने के लिए इसे व्यक्त करने का एक सुविधाजनक तरीका है:
import string
class Del:
def __init__(self, keep=string.digits):
self.comp = dict((ord(c),c) for c in keep)
def __getitem__(self, k):
return self.comp.get(k)
DD = Del()
x='aaa12333bb445bb54b5b52'
x.translate(DD)
भी निकलता है '1233344554552'। हालाँकि, इसे xx.py में रखकर हमारे पास ...:
$ python3.1 -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 8.43 usec per loop
$ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
10000 loops, best of 3: 24.3 usec per loop
... जो दिखाता है कि प्रदर्शन लाभ गायब हो जाता है, इस तरह के "विलोपन" कार्यों के लिए, और प्रदर्शन में कमी हो जाती है।
x.translate(None, string.digits)वास्तव में परिणाम 'aaabbbbbb', जो कि इरादा है के विपरीत है।
allबिलिन ... इस बारे में निश्चित नहीं है!
उपयोग करें re.sub, जैसे:
>>> import re
>>> re.sub('\D', '', 'aas30dsa20')
'3020'
\D किसी भी गैर-अंक चरित्र से मेल खाता है, इसलिए उपरोक्त कोड, अनिवार्य रूप से खाली स्ट्रिंग के लिए हर गैर-अंक चरित्र की जगह ले रहा है।
या आप का उपयोग कर सकते हैं filter, जैसे (अजगर 2 में):
>>> filter(str.isdigit, 'aas30dsa20')
'3020'
चूंकि पायथन 3, के filterबजाय एक पुनरावृत्ति देता है list, आप इसके बजाय निम्नलिखित का उपयोग कर सकते हैं:
>>> ''.join(filter(str.isdigit, 'aas30dsa20'))
'3020'
isdigit, जेनरेटर isdigtउनके बीच में आधा है
rकच्चे तार के लिए उपयोग करें :re.sub(r"\D+", "", "aas30dsa20")
s=''.join(i for i in s if i.isdigit())
एक और जनरेटर संस्करण।
आप फ़िल्टर का उपयोग कर सकते हैं:
filter(lambda x: x.isdigit(), "dasdasd2313dsa")
Python3.0 पर आपको इसे शामिल करना होगा (थोड़े बदसूरत :()
''.join(filter(lambda x: x.isdigit(), "dasdasd2313dsa"))
strकरने के listलिए परिवर्तित करें कि यह py2 और py3 दोनों पर काम करता है:''.join(filter(lambda x: x.isdigit(), list("dasdasd2313dsa")))
बायर के जवाब की तर्ज पर:
''.join(i for i in s if i.isdigit())
-कोई अंक नहीं है।
x.translate(None, string.digits)
स्ट्रिंग से सभी अंकों को हटा देगा। अक्षरों को हटाने और अंकों को रखने के लिए, यह करें:
x.translate(None, string.letters)
TypeError: अनुवाद मिलता है () दिया गया एक तर्क (2 दिया)। इसकी वर्तमान स्थिति में यह सवाल क्यों उठाया गया, यह काफी निराशाजनक है।
सेशन में टिप्पणियों का उल्लेख है कि वह दशमलव स्थान रखना चाहता है। यह वर्णों को सूचीबद्ध करने के लिए स्पष्ट रूप से सूचीबद्ध करके पुनः.सुब विधि (दूसरे और IMHO सर्वोत्तम उत्तर के अनुसार) के साथ किया जा सकता है
>>> re.sub("[^0123456789\.]","","poo123.4and5fish")
'123.45'
पायथन 3 के लिए एक तेज़ संस्करण:
# xx3.py
from collections import defaultdict
import string
_NoneType = type(None)
def keeper(keep):
table = defaultdict(_NoneType)
table.update({ord(c): c for c in keep})
return table
digit_keeper = keeper(string.digits)
यहाँ एक प्रदर्शन तुलना बनाम रेगेक्स है:
$ python3.3 -mtimeit -s'import xx3; x="aaa12333bb445bb54b5b52"' 'x.translate(xx3.digit_keeper)'
1000000 loops, best of 3: 1.02 usec per loop
$ python3.3 -mtimeit -s'import re; r = re.compile(r"\D"); x="aaa12333bb445bb54b5b52"' 'r.sub("", x)'
100000 loops, best of 3: 3.43 usec per loop
तो यह मेरे लिए रेगेक्स की तुलना में 3 गुना अधिक तेज है। यह class Delऊपर से भी तेज है , क्योंकि defaultdictइसके सभी लुकअप सी (धीमी) पायथन के बजाय C में हैं। तुलना के लिए यहां मेरे उसी सिस्टम पर वह संस्करण है।
$ python3.3 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
100000 loops, best of 3: 13.6 usec per loop
बदसूरत लेकिन काम करता है:
>>> s
'aaa12333bb445bb54b5b52'
>>> a = ''.join(filter(lambda x : x.isdigit(), s))
>>> a
'1233344554552'
>>>
list(s)?
filter(lambda x: x.isdigit(), s)मेरे लिए ठीक काम किया। ... ओह, यह इसलिए है क्योंकि मैं 2.7 पायथन का उपयोग कर रहा हूं।
$ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 छोरों, 3 का सबसे अच्छा: 2.48 usec प्रति पाश
$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))'
100000 लूप, 3 का सर्वश्रेष्ठ: 2.02 प्रति लूप usec
$ python -mtimeit -s'import re; x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 लूप्स, सर्वश्रेष्ठ 3: 2.37 usec प्रति लूप
$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))'
100000 लूप्स, सर्वश्रेष्ठ 3: 1.97 usec प्रति लूप
मैंने देखा था कि ज्वाइन उप की तुलना में तेज है।
आप प्रत्येक वर्ण पढ़ सकते हैं। यदि यह अंक है, तो इसे उत्तर में शामिल करें। str.isdigit() विधि एक तरह से करता है, तो एक चरित्र अंकों है पता करने के लिए है।
your_input = '12kjkh2nnk34l34'
your_output = ''.join(c for c in your_input if c.isdigit())
print(your_output) # '1223434'
मैंने इसका इस्तेमाल किया। 'letters'उन सभी पत्रों को शामिल करना चाहिए जिनसे आप छुटकारा पाना चाहते हैं:
Output = Input.translate({ord(i): None for i in 'letters'}))
उदाहरण:
Input = "I would like 20 dollars for that suit"
Output = Input.translate({ord(i): None for i in 'abcdefghijklmnopqrstuvwxzy'}))
print(Output)
आउटपुट:
20