我想匹配下面的字符串,
str1: xxx(yyy) (zzz(qqq))
str2: xxx(yyy)
我写了一个只能匹配str1的正则表达式:
>>> s = re.compile(r'([^\(]+)\((.+)\)\s*\(([^\(]+)\((.+)\)\)')
>>> m = s.match('xxx(yyy) (zzz(qqq))')
>>> for i in m.groups(): print i
...
xxx
yyy
zzz
qqq
>>> m = s.match('xxx(yyy)')
>>> for i in m.groups(): print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
我该如何解决这个问题?
答案 0 :(得分:1)
错误AttributeError: 'NoneType' object has no attribute 'groups'
表示您无法将groups
方法应用于任何内容。
match
返回None
您的正则表达式不正确,第三组和第四组可能不存在。最好在括号内查找任何字符串。
同样match
仅查找行开头的匹配模式。
您可以使用findall
但它会返回一个列表,因此finditer
似乎更合适
这是更正的正则表达式:s = re.compile(r'(?:\(?([^\(\)]+)\(?([^\(\)]+)\)\)?\s*)')
但是,使用finditer只需要寻找更简单的模式。所以下面的正则表达式是不同的:
import re
s=re.compile(r'\(?([^\s\(\)]+)\)?')
string1='aa (bbbb) (cc (dddd) )'
string2='aa (bbbb) '
for string in [string1,string2]:
print string
m = s.finditer(string)
for i in m: print i.group(1)