>>> import re
>>> RE_FUNCTION_PARAM_NAME = '[\,\(;]\s*(.*?)\s*[\,:]'
>>> testStr = 'function Func(i: Integer; s1, s2,s3,s4: string): Boolean;'
>>> pattern = re.compile(RE_FUNCTION_PARAM_NAME)
>>> print pattern.findall(testStr)
['i', 's1', 's3']
>>>
上面这段Python脚本,希望解析出testStr中的i、s1、s2、s3、s4
但是实际解析结果只有i、s1、s3
正确的正则表达式应该是什么样的?
可以使用
'[,(;]\s*(.*?)\s*(?=[,:])'
。,(;:
在[]
里面不是特殊字符,所以不用转义,当然转义了也没事;你的正则的问题是正则最后会匹配一个逗号或者分号,所以下次匹配是从逗号或者分号的位置
之后
匹配的,所以当匹配成功s1
之后,是从s2,s3,s4: string): Boolean;'
这个位置开始匹配的,因为开头的,
号已经被s1
匹配走了,所以下一次匹配是从s2
后面的逗号开始的,所以s2
匹配不上,同理s4
前面的逗号让s3
匹配走了,所以s4
没有匹配上。所以,我用断言匹配后面的逗号或分号。
Update1:
不用断言,可以使用这个
因为变量名后面是空格或者逗号或者冒号或右括号,所以匹配的时候匹配
[^,:\s]+
,即一到多个非空格,逗号,冒号和右括号的字符就行了。