2009-06-09 9 views
6

मैं irclib का उपयोग कर पायथन में एक आईआरसी बॉट लिख रहा हूं और मैं कुछ चैनलों पर संदेशों को लॉग करने की कोशिश कर रहा हूं।
मुद्दा यह है कि कुछ एमआईआरसी उपयोगकर्ता और कुछ बॉट color codes का उपयोग करके लिखते हैं।
कोई विचार है कि मैं उन हिस्सों को कैसे रोक सकता हूं और केवल स्पष्ट एसीआईआई पाठ संदेश छोड़ सकता हूं?एमआईआरसी उपयोगकर्ताओं द्वारा उपयोग किए जाने वाले रंग कोड कैसे पट्टी करें?

+2

चैनल + एस: पी – Eevee

उत्तर

12

नियमित अभिव्यक्ति मेरी राय में आपकी सबसे साफ शर्त है। यदि आपने पहले उनका उपयोग नहीं किया है, this एक अच्छा संसाधन है। पायथन की रेगेक्स लाइब्रेरी पर पूरी जानकारी के लिए, here पर जाएं।

import re 
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 

^सी (जो ASCII में \ X03 है, तो आप (3) कमांड लाइन पर chr करके पुष्टि कर सकते हैं), और फिर वैकल्पिक रूप से एक या दो [0-9] पात्रों के लिए लग रहा है के लिए रेगुलर एक्सप्रेशन से खोजें , फिर वैकल्पिक रूप से एक अल्पविराम के बाद और फिर एक या दो [0-9] वर्णों का पालन किया जाता है।

(? ...) भंडारण क्या कोष्टक में पाया गया था (जैसा कि हम इसे backreference की जरूरत नहीं है), के बारे में भूल करने के लिए कहते हैं? का अर्थ है 0 या 1 और {n, m} का मिलान पिछले समूह के एन से मिलान करने का है। अंत में, \ d का अर्थ है [0-9]।

शेष को ऊपर दिए गए लिंक का उपयोग करके डीकोड किया जा सकता है।

>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla") 
'blabla to be colored text and background blabla' 

अराजकता 'समाधान समान है, लेकिन दो नंबर की एक अधिकतम की तुलना में अधिक खा खत्म हो सकता है और किसी भी ढीली^सी अक्षर हैं जो के बारे में फांसी हो सकती है को नहीं निकाला जाएगा (जैसे कि एक है कि बंद कर देता है के रूप में रंग आदेश)

+0

बिल्कुल सही, धन्यवाद। अच्छा जवाब और महान स्पष्टीकरण। मैंने \ x1f | \ x02 | जोड़ा है ताकि वह बोल्ड और अंडरलाइन फ़िल्टर भी कर सके। re.compile ("\ x1f | \ x02 | \ x03 (?: \ d {1,2} (?:, \ d {1,2})?)?", re.UNICODE) – daniels

0

मैं भी जो कुछ भी उपयोग यह

regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 
regex.sub('', msg) 
1

है के रूप में मैं इस सवाल उपयोगी पाया '\x0f' जोड़ने के लिए, मैं समझ मैं योगदान होता था।

मैं regex

regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE) 

\x16 "रिवर्स" चरित्र को हटा दिया, कुछ चीज़ें गयी। \x0f एक और बोल्ड चरित्र से छुटकारा पाता है।

7

दूसरा रेटेड और निम्नलिखित सुझाव दोषपूर्ण हैं, क्योंकि वे जो भी चरित्र के बाद अंकों की तलाश करते हैं, लेकिन रंग कोड चरित्र के बाद नहीं।

मैं सुधार हुआ है और संयुक्त है सभी पोस्ट, निम्नलिखित परिणामों के साथ:

  • हम बिना पाठ में छोड़ने अंक रिवर्स चरित्र
  • निकालने रंग कोड को दूर करना

समाधान:

regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

1

AutoDl-irssi एक बहुत अच्छा पर्ल में लिखा एक था, यहाँ यह अजगर में है:

def stripMircColorCodes(line) : line = re.sub("\x03\d\d?,\d\d?","",line) line = re.sub("\x03\d\d?","",line) line = re.sub("[\x01-\x1F]","",line) return line

0

मैं जानता हूँ कि मैं एक चाहने तैनात रेगेक्स समाधान क्योंकि यह क्लीनर हो सकता है, मैंने एक गैर रेगेक्स समाधान बनाया है जो सही काम करता है।

def colourstrip(data): 
    find = data.find('\x03') 
    while find > -1: 
     done = False 
     data = data[0:find] + data[find+1:] 
     if len(data) <= find+1: 
      done = True 
     try: 
      assert int(data[find]) 
      data = data[0:find] + data[find+1:] 
     except: 
      done = True 
     try: 
      assert not done 
      assert int(data[find]) 
      data = data[0:find] + data[find+1:] 
     except: 
      if not done and (data[find] != ','): 
       done = True 
     if (len(data) > find+1) and (data[find] == ','): 
      try: 
       assert not done 
       assert int(data[find+1]) 
       data = data[0:find] + data[find+1:] 
       data = data[0:find] + data[find+1:] 
      except: 
       done = True 
      try: 
       assert not done 
       assert int(data[find]) 
       data = data[0:find] + data[find+1:] 
      except: pass 

     find = data.find('\x03') 
    data = data.replace('\x1d','') 
    data = data.replace('\x1f','') 
    data = data.replace('\x16','') 
    data = data.replace('\x0f','') 
    return data 

datastring = '\x0312,4This is coolour \x032,4This is too\x03'  
print(colourstrip(datastring)) 

सभी हर किसी को मदद के लिए धन्यवाद।

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

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