Python中的属性错误。如何使用匹配和组?

时间:2015-09-09 02:45:47

标签: python regex

我试图让以下工作。我查看了Python文档,但我仍然不知道如何修复它。我得到了一个AttributeError,我做错了什么?

import re
text = '>:{abcd|}+)_(#)_@_Mitch_(@<$)_)*zersx!)Pamela@(_+)('
m = re.match(r'(?P<name1>[A-Z][A-Za-z]*) (?P<name2>[A-Z][A-Za-z]*)', text)
m.group('name1')

如果上述内容不正确,我该如何输出

>>> m.group('name1') = 'Mitch'

2 个答案:

答案 0 :(得分:0)

可能是您尝试引用的命名组实际上并未匹配该模式的字符串。

尝试在返回的值上调用组,您将看到所有匹配组的元组。

答案 1 :(得分:0)

这是与Python相关的问题:未匹配的组未初始化,因此无法完成整个匹配。您需要在组内明确声明一个空的替代,因为它实际上是可选的,并且与其他正则表达式一样。此外,你有_,而不是之间的空格,所以我建议使用[\s_]字符类来匹配两种选择:

所以,在你的情况下,你可以这样做:

(?P<name1>[A-Z][A-Za-z]*)[\s_](?P<name2>[A-Z][A-Za-z]*|)
                         ^^^^^                        ^^ 

请参阅a regex demo

示例IDEONE demo

import re
p = re.compile(ur'(?P<name1>[A-Z][A-Za-z]*)[\s_](?P<name2>[A-Z][A-Za-z]*|)')
test_str = u">:{abcd|}+)_(#)_@_Mitch_(@<$)_)*zersx!)Pamela@(_+)("
match = re.search(p, test_str)
if match:
    print(match.group("name1")) # => Mitch