正则表达式匹配字符串' xxx(yyy)(zzz(qqq))'或者' xxx(yyy)'

时间:2014-04-19 03:49:11

标签: python regex

我想匹配下面的字符串,

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'

我该如何解决这个问题?

1 个答案:

答案 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)