अजगर, स्ट्रिंग से सभी गैर-वर्णमाला चार्ट हटा दें


93

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

def mapfn(k, v):
    print v
    import re, string 
    pattern = re.compile('[\W_]+')
    v = pattern.match(v)
    print v
    for w in v.split():
        yield w, 1

मुझे डर है कि मुझे यकीन नहीं है कि reउस मामले के लिए लाइब्रेरी या रेगेक्स का उपयोग कैसे किया जाए । मुझे यकीन नहीं है कि vकिसी भी गैर-अल्फ़ान्यूमेरिक वर्णों के बिना नई पंक्ति को पुनः प्राप्त करने के लिए आने वाली स्ट्रिंग (पुस्तक की पंक्ति) को रेगेक्स पैटर्न कैसे लागू किया जाए।

सुझाव?


vएक पुस्तक की एक पूरी पंक्ति है (विशेष रूप से डिकी डिक), मैं शब्द से जा रहा हूँ शब्द चार द्वारा नहीं। तो कुछ शब्दों में अंत में "अकर्मण्यता", "अकर्मण्यता" के साथ मानचित्र नहीं होता है।
केडेकर


लोलक्स - क्या आपको मेरे जैसा ही पूर्व-साक्षात्कार घरेलू व्यायाम मिला था? मोबी डिक में 50 सबसे अधिक इस्तेमाल किए जाने वाले शब्द ढूंढें और उनकी आवृत्ति की रिपोर्ट करें। मैंने इसे C ++, IIRC
Mawg में कहा कि मोनिका

1
@Mawg यह मेरे अंडरग्राउंड "क्लाउड कंप्यूटिंग" वर्ग में एक अभ्यास था।
केडेकर

जवाबों:


130

उपयोग re.sub

import re

regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

वैकल्पिक रूप से, यदि आप केवल वर्णों के एक निश्चित समूह को हटाना चाहते हैं (जैसा कि आपके इनपुट में एपोस्ट्रोफी ठीक हो सकती है ...)

regex = re.compile('[,\.!?]') #etc.

हम्म, मैं इसे काफी नीचे ट्रैक कर सकता हूं, लेकिन रिक्त स्थान को छोड़कर सभी गैर-अल्फ़ान्यूमेरिक्स को हटाने के पैटर्न के बारे में क्या?
केडेकर

1
बस अपने संग्रह वर्ग में एक स्थान जोड़ें। यानी ^a-zA-Z बजाय सिर्फ^a-zA-Z
limasxgoesto0

जब तक कि आप नई स्थिति के बारे में चिंतित न हों, किस स्थिति में हैं a-zA-Z \n। मैं एक रेगेक्स ढूंढने की कोशिश कर रहा हूं जो दोनों को एक में लपकाएगा लेकिन मुझे वांछित व्यवहार नहीं दे रहा है \wया \Wनहीं दे रहा है। \nअगर ऐसा है तो आपको बस जोड़ना पड़ सकता है ।
limasxgoesto0

आह, न्यूलाइन चार। थॉट्स जहां मेरे मुद्दे निहित हैं, मैं दिए गए परिणामों के अपने परिणामों की तुलना कर रहा था और मैं अभी भी बंद था। मुझे लगता है कि यह मेरा मुद्दा है! धन्यवाद // हम्म, मैंने इसे newline char उसी परिणाम के साथ आज़माया, मुझे लगता है कि एक और चीज़ मुझे याद आ रही है .. // Duhhh ... अपर और लोअर केस ... // सभी मदद के लिए धन्यवाद, अब पूरी तरह से काम करता है!
केडेकर

50

यदि आप रेगेक्स का उपयोग नहीं करना पसंद करते हैं, तो आप कोशिश कर सकते हैं

''.join([i for i in s if i.isalpha()])

मैं इससे कैसे जुड़ूं? '' के साथ। मुद्रण s को केवल एक फ़िल्टर ऑब्जेक्ट मिलता है
PirateApp

1
वाह, यह वही है जो मैं देख रहा था। इसमें कांजी, हीरागाना, कटकाना, आदि को ध्यान में रखा गया है। प्रशंसा
root163

34

आप इन वर्णों को हटाने के लिए re.sub () फ़ंक्शन का उपयोग कर सकते हैं:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

re.sub (MATCH PATTERN, REPLACE STRING, SEARCH को STRING)

  • "[^a-zA-Z]+" - वर्णों के किसी ऐसे समूह की तलाश करें जो z-z नहीं हैं।
  • "" - मिलान किए गए वर्णों को "" से बदलें

ध्यान दें कि इससे उच्चारण पत्र भी निकल जाएंगे: ãâàéèçõ, आदि
ब्रैड

19

प्रयत्न:

s = ''.join(filter(str.isalnum, s))

यह स्ट्रिंग से हर चार को ले जाएगा, केवल अल्फ़ान्यूमेरिक वाले रखें और उनसे एक स्ट्रिंग का निर्माण करें।


2
यह उत्तर बहुत अधिक स्पष्टीकरण और प्रासंगिक प्रलेखन के लिंक का उपयोग कर सकता है।
pdoherty926

4

सबसे तेज़ विधि regex है

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)

""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)


2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join

0

यदि आप विशिष्ट यूनिकोड संपत्ति वर्गों से मेल खाने की योजना बनाते हैं, तो PyPi regexमॉड्यूल का उपयोग करना उचित है । यह पुस्तकालय भी अधिक स्थिर साबित हुआ है, विशेष रूप से बड़े ग्रंथों को संभालने और विभिन्न पायथन संस्करणों में लगातार परिणाम देता है। बस आपको इसे अप-टू-डेट रखना है।

यदि आप इसे स्थापित कर रहे हैं (उपयोग कर रहे हैं pip intall regexया pip3 install regex), तो आप उपयोग कर सकते हैं

import regex
print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') )
// => ABCŁąćАбвdef

यूनिकोड अक्षरों के अलावा 1 या उससे अधिक वर्णों के सभी वर्णों को निकालने के लिए text। एक ऑनलाइन पायथन डेमो देखें । आप "".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))एक ही परिणाम प्राप्त करने के लिए भी उपयोग कर सकते हैं ।

पायथन में re, किसी भी यूनिकोड पत्र से मिलान करने के लिए, कोई भी[^\W\d_] निर्माण का उपयोग कर सकता है ( किसी भी यूनिकोड से मिलान करें )।

इसलिए, सभी गैर-अक्षर वर्णों को हटाने के लिए, आप या तो सभी पत्रों से मेल खा सकते हैं और परिणामों में शामिल हो सकते हैं:

result = "".join(re.findall(r'[^\W\d_]', text))

या, उन सभी चार्ट को हटा दें, जिनके साथ मिलान किया गया है [^\W\d_]:

result = re.sub(r'([^\W\d_])|.', r'\1', text, re.DOTALL)

ऑनलाइन रेगेक्स डेमो देखें । हालाँकि , आप विभिन्न पायथन संस्करणों में असंगत परिणाम प्राप्त कर सकते हैं क्योंकि यूनिकोड मानक विकसित हो रहा है, और मिलान किए गए वर्णों का सेट \wपायथन संस्करण पर निर्भर करेगा। regexलगातार परिणाम प्राप्त करने के लिए PyPi लाइब्रेरी का उपयोग करने की अत्यधिक अनुशंसा की जाती है।

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