2013-08-20 103 views
3

我有一個具有結構如下行的文本文件:解決簡單的regex

class.method(params) 

我想獲得的類,方法,而params。 請記住,有時候沒有參數,甚至可能沒有括號。

到目前爲止,我已經得到了

re.search(r'\w+', string) 

但如果PARAMS是用引號括起來,他們被刪除了,我想留住他們。

我該如何保留它們?

例子:

>>> process('class.method(params)') 
('class','method','params') 
>>> process('class.method("params")') 
('class','method','"params"') 
>>> process('class.method('params')') 
('class','method',''params'') 
>>> process('class.method()') 
('class','method','') 
>>> process('class.method') 
('class','method','') 
+1

你需要提供更多的輸入和期望的輸出,否則你可能會使用'。+'。 – HamZa

+2

你試圖解析的文件(注意解析詞)實際上是一個語言源文件嗎? –

+0

@smerny我意識到我想要他們在組 – Erandros

回答

4

這個怎麼樣?

>>> import re 
>>> reg_exp = '(\w+)\.(\w+)\(?([^)]*)\)?' 
>>> re.match(reg_exp, 'class.method("params")').groups() 
('class', 'method', '"params"') 
>>> re.match(reg_exp, "class.method('params')").groups() 
('class', 'method', "'params'") 
>>> re.match(reg_exp, "class.method()").groups() 
('class', 'method', '') 
>>> re.match(reg_exp, 'class.method(params)').groups() 
('class', 'method', 'params') 
>>> re.match(reg_exp, 'class.method').groups() 
('class', 'method', '') 
  • (\w+)是匹配1或多個字母數字字符
  • ([^)]*)是匹配的任何字符以外)
  • \(?匹配(或全無
  • \)?匹配)或捕獲組捕獲組沒有什麼

\(?([^)]*)\)?有助於處理沒有參數和括號的情況。

+1

OP沒有提到想要的組,問題似乎是'\ w'不匹配引號。 – smerny

+0

另外,我會將parens/params全部放在一個組中,因爲例如如果沒有'('不應該有''''')。就像'(\([^)] * \))?' – smerny

+0

準確地說,如果PARAMS包含在引號中,它不起作用。 – Erandros