2017-04-06 74 views
0

我上一個Python語法分析器使用層和我在的形式來解析輸入:厚度:非法字符「+」

VAR VAR1 001 
+000 000 000 000 

當代碼將創建一個名爲VAR 1變量然後分配值0到它

我寫的instanciation的正則表達式是:

t_INST = r'[\+|-]0[ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9]' 

但是我運行程序時,厚度打印以下內容:

Illegal character '+' 

再現器如下:

import ply.lex as lex 

tokens = ['INST'] 
t_INST = r'[+-]0[ ](\d{3}[ ]){3}\d{3}'; 
t_ignore = ' \t' 
def t_error(t): 
    print("Illegal character '%s'" % t.value[0]) 
    t.lexer.skip(1) 

lexer = lex.lex() 

def parse(input_string): 
    ret = [] 
    lexer.input (input_string) 
    while True: 
     tok = lexer.token() 
     if not tok: 
      break  # No more input 
     ret.append((tok.type, tok.value)) 
    return ret 

print parse("+0 000 000 000") 
+0

應使用\ d來表示字符,還可以使用{}表示的重複序列:\ + - ](:\ d {3} \ S? ){4} – Neil

+0

爲什麼反斜槓?你希望在正常情況下使用它,但是它在字符類中沒有意義。實際上,除非'|'是一個有效的第一個字符,否則你可能需要'[+ - ]',而不是'[+ | - ]'。 –

+0

順便說一句,將你的再現器 - 儘可能保留爲*最小*將被擴展到它的*完整*和*可驗證*的位置,如http://stackoverflow.com/中所給出的那樣。幫助/ MCVE。現在,有人需要做一些相當的工作來重現錯誤。 –

回答

0

行:

print parse("+0 000 000 000") 

不匹配的

VAR VAR1 001 
+000 000 000 000 

您所陳述的輸入格式,如果實際數據與+0 000 000 000的形式相同,那麼你實際上想要:

t_INST = r'[+-]0\s(?:\d{3}\s){2}\d{3}' 

...與輸出是:[('INST', '+0 000 000 000')]

+0

這是一個正則表達式,我在回答中使用'\ s'作爲快捷鍵和非捕獲組。這聽起來更像是對我的問題的評論。另外,你使用了'{2}'並且應該是'{3}' –

+0

對於OP的測試數據,不,它真的應該是** {2}'。他們的評論是誤導正在使用的實際數據格式。 (這就是爲什麼我花時間讓他們提供一個真正的複製者,而不是直接寫答案)。 –

1

您不必字符類中逃脫+。您可以使用:

t_INST = r'[+|-]0[ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9]' 
    this-----^ 

無論如何,你可以縮短你的正則表達式是這樣的:

t_INST = r'[+|-]0[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{3}[ ][0-9]{3}' 

甚至:

t_INST = r'[+|-]0[ ]([0-9]{3}[ ]){3}[0-9]{3}' 

也注意到您使用[+|-],這是一個字符類和不適用於變化,因此您必須將其更改爲[+-]

所以,最後的正則表達式(使用\d作爲快捷方式[0-9])將是:

t_INST = r'[+-]0[ ](\d{3}[ ]){3}\d{3}' 

順便說一句,你的樣品文中說:

+000 000 000 000 

但是,你正在使用匹配的正則表達式如下:

+0 000 000 000 000 

所以,如果你想要匹配的數據是+000 000 000 000,那麼你必須在正則表達式更改爲:

t_INST = r'[+-](\d{3}[ ]){3}\d{3}' 
+0

......這裏的問題(即我選擇寫出一個相互競爭的答案而不是評論這個問題的不良行爲)是因爲你寫了一個答案,但實際上沒有一個真正的複製者可能會產生他們的問題,因此不能保證你*真的知道OP的問題究竟是什麼。即使're.compile(r'[\ + | - ]')。match('+')'不起作用,我同意會有強烈的猜測依據,但情況並非如此:最初的代碼是* bad *,但是(可測試!)沒有打破最初給出的任何理由。 –

+0

...的確,'re.compile(r'[\ + | - ] 0 [] [0-9] [0-9] [0-9] [] [0-9] [0-9] [ 0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]')match('+ 0 000 000 000 000 ')'返回一個匹配。 –