我试图让以下工作。我查看了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'
答案 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