2017-11-15 24 views
5

मैं एक फ़ाइल है कि input.txt कहा जाता है कहते हैं यहफ़ाइल से अमिश्रित नंबर निकालें

I listened to 4 u2 albums today 
meet me at 5 
squad 4ever 

मैं नंबर होते हैं जो अपने दम पर कर रहे हैं बाहर फ़िल्टर करना चाहते हैं, तो "4" और "5" चाहिए की तरह दिखता है जाओ लेकिन "यू 2" और "4ever" वही रहना चाहिए। यानी उत्पादन होना चाहिए

I listened to u2 albums today 
meet me at 
squad 4ever 

मैं इस कोड

for line in fileinput.input("input.txt", inplace=True): 
    new_s = "" 
    for word in line.split(' '): 
     if not all(char.isdigit() for char in word): 
      new_s += word 
      new_s += ' ' 
    print(new_s, end='') 

कौन सा सुंदर कोड मैं यहां पाया के समान है का उपयोग करने की कोशिश कर रहा है: Removing numbers mixed with letters from string

लेकिन वांछित उत्पादन के बजाय मुझे

I listened to u2 albums today 
meet me at 5 
squad 4ever 

जैसा कि आप देख सकते हैं कि यहां दो समस्याएं हैं, पहले केवल पहली पंक्ति उस अंक को खो देती है जिसे मैं खोना चाहता हूं, "5" अभी भी दूसरी पंक्ति में मौजूद है। दूसरी समस्या एक नई लाइन की शुरुआत में अतिरिक्त सफेद जगह है।

मैं थोड़ी देर के लिए कोड के साथ खेल रहा हूं और स्टैक ओवरफ्लो ब्राउज़ कर रहा हूं, लेकिन यह नहीं पता कि समस्या कहां से आ रही है। कोई अंतर्दृष्टि?

+0

समस्या यह है कि लाइन पर अंतिम शब्द '\ n' के साथ समाप्त होता है। यह एक अंक नहीं है, इसलिए यह if स्टेटमेंट पास करता है, और अतिरिक्त स्थान इसलिए है क्योंकि आप प्रत्येक बार लूप के लिए एक स्थान जोड़ते हैं, जिसमें लाइन पर अंतिम शब्द भी शामिल है। – yinnonsanders

उत्तर

3

str.split(' ') प्रत्येक पंक्ति से पिछली न्यूलाइन को हटा नहीं है। वे लाइन के अंतिम शब्द से जुड़े हुए हैं। तो आपकी पहली समस्या के लिए, '5' हटाया नहीं गया है क्योंकि यह वास्तव में '5\n' है, और \n एक अंक नहीं है।

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

सबसे आसान समाधान बस line.split(' ')line.split() को बदलने के लिए है। किसी भी तर्क के बिना, split() न्यूलाइन सहित सभी व्हाइटस्पेस को हटा देगा। आपको को अपने print से हटाने की आवश्यकता होगी ताकि न्यूलाइन को वापस जोड़ा जा सके।

+1

प्रत्येक पंक्ति के अंत में (नई लाइन से पहले) का उपयोग किया जाना चाहिए, संभवतः 'प्रिंट (new_s [: - 1]) ' – yinnonsanders

+1

@yinnonsanders या भंडारण द्वारा सूची में प्रत्येक पंक्ति के लिए शब्द और '' '.join() '। – glibdud

1

बस regexp का उपयोग करें।

re.sub(r"\b\d+\b", "", input) 

मैच

या से बचने के लिए डबल रिक्त स्थान शब्द सीमाओं के बीच किसी भी अंकों:

re.sub(r"\s\d+\s", " ", input) 
+0

इस तरह के काम, लेकिन यह संख्या को बदलने के दौरान कुछ भी नहीं होने के बजाय एक सफेद जगह छोड़ देता है, जो "आज मैंने 4 यू 2 एल्बमों को सुना है" में "मैंने आज यू 2 एल्बमों को सुना है", "टू" और " U2 "। इसे ठीक करने का कोई तरीका? – Skum

+0

एक समाधान के साथ संपादित – fievel

0

आप उपयोग कर सकते हैं regex:

data = open('file.txt').read() 
import re 
data = re.sub('(?<=\s)\d+(?=$)|(?<=^)\d+(?<=\s)|(\s\d+\s)', '', data) 

आउटपुट:

I listened tou2 albums today 
meet me at 
squad 4ever 
संबंधित मुद्दे