# your code goes here
import re
# ===================================================================================
# This are the current matching groups:
# ===================================================================================
regex = re.compile("((?P<first_name>(\w+)) (?P<middle_name>\w+)) (?P<last_name>\w+)")
# |-------------------- #1 ------------------|
# |------- #2 -------|
# |------- #3 -------|
# |------- #4 -------|
# |------ #5 ------|
# ===================================================================================
# But we want to have the following instead:
# ===================================================================================
# ... ... ... ...("((?P<first_name>(\w+)) (?P<middle_name>\w+)) (?P<last_name>\w+)")
# |---------------- #1 (#1) -----------------|
# |- first_name (#2) -|
# |----- #2 (#3) -----|
# |- middle_name (#4)-|
# | last_name (#5) |
m = regex.match("Pinkamena Diane Pie")
assert list(m.groups()) == [
'Pinkamena Diane', # group #1
'Pinkamena', # group #2 (first_name)
'Pinkamena', # group #3
'Diane', # group #4 (middle_name)
'Pie', # group #5 (last_name)
]
assert dict(m.groupdict()) == {
'first_name': 'Pinkamena', # group #2
'middle_name': 'Diane', # group #4
'last_name': 'Pie', # group #5
}
assert dict(m.re.groupindex) == {
'first_name': 2,
'middle_name': 4,
'last_name': 5,
}
named = m.groupdict()
duplicates = set()
for name, index in m.re.groupindex.items():
if name in named: # check twice, if it is really the named attribute.
duplicates.add(index)
# end def
unnamed = [group for i, group in enumerate(m.groups()) if i+1 not in duplicates]
# end for
print(unnamed)
print(named)
assert unnamed == [
'Pinkamena Diane', # group #1 (#1)
'Pinkamena', # group #2 (#3)
]
assert named == {
'first_name': 'Pinkamena', # group #2
'middle_name': 'Diane', # group #4
'last_name': 'Pie', # group #5
}
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmltcG9ydCByZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRoaXMgYXJlIHRoZSBjdXJyZW50IG1hdGNoaW5nIGdyb3VwczoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpyZWdleCA9IHJlLmNvbXBpbGUoIigoP1A8Zmlyc3RfbmFtZT4oXHcrKSkgKD9QPG1pZGRsZV9uYW1lPlx3KykpICg/UDxsYXN0X25hbWU+XHcrKSIpIAojICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLSAjMSAtLS0tLS0tLS0tLS0tLS0tLS18CiMgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tICMyIC0tLS0tLS18CiMgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tICMzIC0tLS0tLS18CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLSAjNCAtLS0tLS0tfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0gIzUgLS0tLS0tfAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQnV0IHdlIHdhbnQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RlYWQ6CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAuLi4gLi4uIC4uLiAuLi4oIigoP1A8Zmlyc3RfbmFtZT4oXHcrKSkgKD9QPG1pZGRsZV9uYW1lPlx3KykpICg/UDxsYXN0X25hbWU+XHcrKSIpCiMgICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0gIzEgKCMxKSAtLS0tLS0tLS0tLS0tLS0tLXwKIyAgICAgICAgICAgICAgICAgICAgfC0gZmlyc3RfbmFtZSAoIzIpIC18CiMgICAgICAgICAgICAgICAgICAgIHwtLS0tLSAjMiAoIzMpIC0tLS0tfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0gbWlkZGxlX25hbWUgKCM0KS18CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsYXN0X25hbWUgKCM1KSB8CgptID0gcmVnZXgubWF0Y2goIlBpbmthbWVuYSBEaWFuZSBQaWUiKQphc3NlcnQgbGlzdChtLmdyb3VwcygpKSA9PSBbCgknUGlua2FtZW5hIERpYW5lJywgICMgZ3JvdXAgIzEKCSdQaW5rYW1lbmEnLCAgICAgICAgIyBncm91cCAjMiAoZmlyc3RfbmFtZSkKCSdQaW5rYW1lbmEnLCAgICAgICAgIyBncm91cCAjMwoJJ0RpYW5lJywgICAgICAgICAgICAjIGdyb3VwICM0IChtaWRkbGVfbmFtZSkKCSdQaWUnLCAgICAgICAgICAgICAgIyBncm91cCAjNSAobGFzdF9uYW1lKQpdCgphc3NlcnQgZGljdChtLmdyb3VwZGljdCgpKSA9PSB7CgknZmlyc3RfbmFtZSc6ICAnUGlua2FtZW5hJywgICMgZ3JvdXAgIzIKCSdtaWRkbGVfbmFtZSc6ICdEaWFuZScsICAgICAgIyBncm91cCAjNAoJJ2xhc3RfbmFtZSc6ICAgJ1BpZScsICAgICAgICAjIGdyb3VwICM1Cn0KCmFzc2VydCBkaWN0KG0ucmUuZ3JvdXBpbmRleCkgPT0gewoJJ2ZpcnN0X25hbWUnOiAgMiwKCSdtaWRkbGVfbmFtZSc6IDQsCgknbGFzdF9uYW1lJzogICA1LAp9CgpuYW1lZCA9IG0uZ3JvdXBkaWN0KCkKZHVwbGljYXRlcyA9IHNldCgpCmZvciBuYW1lLCBpbmRleCBpbiBtLnJlLmdyb3VwaW5kZXguaXRlbXMoKToKICAgIGlmIG5hbWUgaW4gbmFtZWQ6ICAjIGNoZWNrIHR3aWNlLCBpZiBpdCBpcyByZWFsbHkgdGhlIG5hbWVkIGF0dHJpYnV0ZS4KICAgICAgICBkdXBsaWNhdGVzLmFkZChpbmRleCkKICAgICMgZW5kIGRlZgp1bm5hbWVkID0gW2dyb3VwIGZvciBpLCBncm91cCBpbiBlbnVtZXJhdGUobS5ncm91cHMoKSkgaWYgaSsxIG5vdCBpbiBkdXBsaWNhdGVzXQojIGVuZCBmb3IKICAgICAgICAKcHJpbnQodW5uYW1lZCkKcHJpbnQobmFtZWQpCgphc3NlcnQgdW5uYW1lZCA9PSBbCgknUGlua2FtZW5hIERpYW5lJywgICMgZ3JvdXAgIzEgKCMxKQoJJ1BpbmthbWVuYScsICAgICAgICAjIGdyb3VwICMyICgjMykKXQoKYXNzZXJ0IG5hbWVkID09IHsKCSdmaXJzdF9uYW1lJzogICdQaW5rYW1lbmEnLCAgIyBncm91cCAjMgoJJ21pZGRsZV9uYW1lJzogJ0RpYW5lJywgICAgICAjIGdyb3VwICM0CgknbGFzdF9uYW1lJzogICAnUGllJywgICAgICAgICMgZ3JvdXAgIzUKfQo=