fork download
  1. # your code goes here
  2. import re
  3.  
  4. # ===================================================================================
  5. # This are the current matching groups:
  6. # ===================================================================================
  7. regex = re.compile("((?P<first_name>(\w+)) (?P<middle_name>\w+)) (?P<last_name>\w+)")
  8. # |-------------------- #1 ------------------|
  9. # |------- #2 -------|
  10. # |------- #3 -------|
  11. # |------- #4 -------|
  12. # |------ #5 ------|
  13. # ===================================================================================
  14. # But we want to have the following instead:
  15. # ===================================================================================
  16. # ... ... ... ...("((?P<first_name>(\w+)) (?P<middle_name>\w+)) (?P<last_name>\w+)")
  17. # |---------------- #1 (#1) -----------------|
  18. # |- first_name (#2) -|
  19. # |----- #2 (#3) -----|
  20. # |- middle_name (#4)-|
  21. # | last_name (#5) |
  22.  
  23. m = regex.match("Pinkamena Diane Pie")
  24. assert list(m.groups()) == [
  25. 'Pinkamena Diane', # group #1
  26. 'Pinkamena', # group #2 (first_name)
  27. 'Pinkamena', # group #3
  28. 'Diane', # group #4 (middle_name)
  29. 'Pie', # group #5 (last_name)
  30. ]
  31.  
  32. assert dict(m.groupdict()) == {
  33. 'first_name': 'Pinkamena', # group #2
  34. 'middle_name': 'Diane', # group #4
  35. 'last_name': 'Pie', # group #5
  36. }
  37.  
  38. assert dict(m.re.groupindex) == {
  39. 'first_name': 2,
  40. 'middle_name': 4,
  41. 'last_name': 5,
  42. }
  43.  
  44. named = m.groupdict()
  45. duplicates = set()
  46. for name, index in m.re.groupindex.items():
  47. if name in named: # check twice, if it is really the named attribute.
  48. duplicates.add(index)
  49. # end def
  50. unnamed = [group for i, group in enumerate(m.groups()) if i+1 not in duplicates]
  51. # end for
  52.  
  53. print(unnamed)
  54. print(named)
  55.  
  56. assert unnamed == [
  57. 'Pinkamena Diane', # group #1 (#1)
  58. 'Pinkamena', # group #2 (#3)
  59. ]
  60.  
  61. assert named == {
  62. 'first_name': 'Pinkamena', # group #2
  63. 'middle_name': 'Diane', # group #4
  64. 'last_name': 'Pie', # group #5
  65. }
  66.  
Success #stdin #stdout 0.02s 27712KB
stdin
Standard input is empty
stdout
['Pinkamena Diane', 'Pinkamena']
{'first_name': 'Pinkamena', 'middle_name': 'Diane', 'last_name': 'Pie'}