स्ट्रिंग से संख्या हटाना [बंद]


121

मैं एक स्ट्रिंग से अंक कैसे निकाल सकता हूं?


19
के साथ re:result = re.sub(r'[0-9]+', '', s)
विकटोरिया स्ट्राइब्यूव

regex के साथ आपको \ n जोड़ना होगा। यह भी, क्योंकि यह दशमलव संख्या हो सकती है जो मुझे लगता है। जैसे परिणाम = re.sub (r '[0-9 \।] +', '', s)
गुरुचनगिन

1
"\d"के रूप में एक regex में एक ही है "[0-9]", तो आप result = re.sub(r"\d+", "", s)इसके बजाय कर सकते हैं । गति संभवतः उपयोग किए जा रहे विशेष स्ट्रिंग पर निर्भर करेगी, लेकिन मेरे लिए, re.subलगभग दो बार लिया str.translate(जब तक कि आप पूर्व-संकलित पैटर्न का उपयोग नहीं करते हैं)।
नाथन

जवाबों:


185

क्या यह आपकी स्थिति के लिए काम करेगा?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

यह एक सूची समझ का उपयोग करता है, और यहां जो कुछ हो रहा है वह इस संरचना के समान है:

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

जैसा कि @AshwiniChaudhary और @KirkStrauser बताते हैं, आपको वास्तव में वन-लाइनर में कोष्ठक का उपयोग करने की आवश्यकता नहीं है, जिससे कोष्ठक के अंदर का टुकड़ा एक जनरेटर अभिव्यक्ति (एक सूची समझ से अधिक कुशल) हो जाता है। यहां तक ​​कि अगर यह आपके असाइनमेंट के लिए आवश्यकताओं को फिट नहीं करता है, तो यह कुछ ऐसा है जिसे आपको अंततः पढ़ना चाहिए :)

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'

@SeanJohnson बहुत बढ़िया! मुझे यकीन है कि मैंने सीखा है कि इस साइट पर किसी और से, इसलिए चक्र पूरा हो गया है :)
RocketDonkey

@RocketDonkey की कोई आवश्यकता नहीं[]
अश्विनी चौधरी

3
पायथन 2.7 और इसके बाद के संस्करण में, आपको सूची बोध के आसपास कोष्ठक की आवश्यकता नहीं है। आप उन्हें छोड़ सकते हैं और यह एक जनरेटर अभिव्यक्ति बन जाता है।
कर्क स्ट्रूसर

फिक्स्ड - धन्यवाद @ अश्विनीचौधरी / @ किर्कसट्रुसर।
रॉकेटडॉन्की

@RocketDonkey कुछ स्पष्टीकरण भी जोड़ता है, बस कोड को देखने से मुझे ओपी का अनुमान लगाने में मदद नहीं मिलेगी।
अश्विनी चौधरी

98

और, बस मिश्रण में फेंकने के लिए, यह अक्सर भूल गया है str.translateजो लूपिंग / नियमित अभिव्यक्ति की तुलना में बहुत तेजी से काम करेगा:

पायथन 2 के लिए:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

पायथन 3 के लिए:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'

13
यह दृष्टिकोण पायथन 3 में काम नहीं करेगा। इसके बजाय करें: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev

3
पायथन 2 के लिए सबसे अच्छा समाधान।
हर्ष वर्धन

यूनिकोड चरित्र तार के लिए काम नहीं करता है
हैरी एम

20

सुनिश्चित नहीं हैं कि यदि आपका शिक्षक आपको फ़िल्टर का उपयोग करने की अनुमति देता है लेकिन ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

returns-

'aaasdffgh'

लूपिंग की तुलना में बहुत अधिक कुशल ...

उदाहरण:

for i in range(10):
  a.replace(str(i),'')

1
इसके बजाय यह देता है: <फ़िल्टर ऑब्जेक्ट 0x03475FD0>
lone_coder


5

बस कुछ (दूसरों ने इनमें से कुछ का सुझाव दिया है)

विधि 1:

''.join(i for i in myStr if not i.isdigit())

विधि 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

विधि 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

विधि 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

विधि 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))

2
इन पर दक्षता तुलना दिखाना सार्थक होगा।
नू एवरेस्ट

2

कहते हैं कि सेंट आपकी अनियंत्रित स्ट्रिंग है, फिर चलाएं

st_nodigits=''.join(i for i in st if i.isalpha())

जैसा कि ऊपर उल्लेख किया गया है। लेकिन मेरा अनुमान है कि आप बहुत ही सरल कुछ चाहिए तो कहते हैं रों अपने स्ट्रिंग और है st_res अंक के बिना एक स्ट्रिंग है, तो यहाँ अपने कोड है

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch

1

मैं इसे पूरा करने के लिए रेगेक्स का उपयोग करना पसंद करूंगा, लेकिन चूंकि आप केवल सूची, लूप, फ़ंक्शन आदि का उपयोग कर सकते हैं।

यहाँ मैं क्या लेकर आया हूँ:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!

1

अगर मैं आपके प्रश्न को सही समझ रहा हूं, तो एक तरीका यह है कि स्ट्रिंग को तार में तोड़ दिया जाए और फिर उस स्ट्रिंग में एक लूप का उपयोग करके प्रत्येक स्ट्रिंग की जांच करें कि क्या यह एक स्ट्रिंग या एक संख्या है और फिर यदि स्ट्रिंग इसे एक चर में बचाती है और फिर एक बार लूप में आती है। समाप्त हो गया है, कि उपयोगकर्ता को प्रदर्शित करें


एक लूप के लिए स्वचालित रूप से एक स्ट्रिंग के हर चरित्र के माध्यम से पुनरावृत्त होता है, इसलिए स्ट्रिंग को स्ट्रिंग में तोड़ने की कोई आवश्यकता नहीं है।
अश्विनी चौधरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.