2015-03-25 88 views
1

注:我使用的是Python3如何從字符串中刪除所有的IRC顏色代碼

我一直在尋找無處不在,什麼也沒找到完整。在任何地方向IRC詢問。我需要一個刪除所有IRC顏色控制代碼的正則表達式。沒有一個完整的解決方案。

粗體,斜體,下劃線,反向,顏色和純文本 字符數分別爲2 29 31 22 3 15。

編輯:

我剛剛發現也正在使用\ X0F字符。

顏色字符(3)後面可能包含最多2位數字,然後可能會有逗號,然後最多可以增加2位數字,也可能沒有數字只是字符3.它也可能只是一個帶有純文本的逗號這種情況下逗號應該留在字符串中。

請幫我困在泥裏。

實施例:

'\003' + '12,4' + 'Red and blue' + '\003'+', \031Underline\031' 

12是藍色和4是紅色的,具有字符3.

預期輸出使用僅僅是「紅和藍,下劃線」純文本,無顏色代碼。這樣,我可以使用:

line = 'Red and blue, Underline' 

line.split(' ')[0] == 'Red' 
+0

一個例子以及預期的輸出會更好。 – 2015-03-25 04:52:19

+0

一個例子是12,4red和藍色,下劃線。控制字符不顯示在瀏覽器中。可能'\ 003'+ '12,4'+'紅色和藍色'+'\ 003'+',\ 031Underline \ 031' – baudsmoke 2015-03-25 04:58:18

+0

請使用代碼塊顯示代碼,如果使用代碼塊,控制字符可以顯示在瀏覽器中。您可以編輯您的問題以更新該問題 – arkoak 2015-03-25 07:15:09

回答

0
[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)? 

這將匹配你所提到的所有IRC格式化代碼。在顏色代碼的情況下,它甚至可以捕獲諸如\x03,11,\x034,\x03,等不正常的格式。我意識到這可能會也可能不是理想的,這取決於您希望如何處理這些格式不正確的代碼,但您可以輕鬆地調整它以實現自己想要的效果。如果需要,你可以解釋你希望如何處理這些問題,並且我可以更新答案以反映這一點。

至於做什麼,一個解決辦法是:

pattern = r'[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)?'; 
text = '\x0312,4Text\x03'; 
stripped = re.sub(pattern, '', text); 

參見Python文檔的Section 6.2

+0

使用\ x03,11 \ x034和\ x03時,逗號應以純文本形式保留。我們又如何使用這個正則表達式?text ='\ x0312,4Text \ x03; striptext = regex_that_returns_plain_text(text) – baudsmoke 2015-03-30 21:45:23

+0

你爲什麼要離開逗號?您將通過留下不應該在那裏的逗號來處理格式錯誤的顏色代碼。整件事應該被剝奪。至於如何應用它,我編輯了答案(儘管你可以通過搜索幾秒鐘找到答案)。 – ZeroKnight 2015-04-01 02:27:22

+0

ZeroKnight逗號保持不變,因爲如果您使用逗號逗號或逗號逗號完成顏色。它沒有畸形,就像設計那樣。所以\ x03,文本,所以它是錯誤的,如果由於控制字符後的空格文本是一個數字?在所有情況下,逗號都是文本的起始位置,而不是刪除。 – baudsmoke 2015-04-08 12:36:41

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('\x02','') 
    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)) 

謝謝大家的幫助。

相關問題