2013-08-20 71 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