title: Trying to understand python regular expression end of string matching with \Z, \b, $ vs just ending the expression
body: <p>Setup: I have a regular expression that matches people's names that have stray punctuation at the end, unless that punctuation belongs there as part of single-letter initials.  So, "Lincoln, Abe." should match, and "Lincoln, A." should not.  I have written an expression that works fine for me, but I am puzzled as to why my previous attempt did not work.</p>
  
  <p>Query: I'd like to figure out why I need to include an end-of-string anchor to my regular expression.
  Here are expressions that successfully match, the way I'd expect:</p>
  
  <pre><code>(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)\Z").match("abc,. def....").groups()
  ('abc,. d', 'ef', '....')
  (Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)\b").match("abc,. def....").groups()
  *** AttributeError: 'NoneType' object has no attribute 'groups'
  (Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)$").match("abc,. def....").groups()
  ('abc,. d', 'ef', '....')
  </code></pre>
  
  <p>I think that I should also be able to match my word without ending my regular expression in an end-of-string character.  However, only the first two groups are acknowledged, the third is returned empty:</p>
  
  <pre><code>(Pdb) re.compile("(.*)(\w{2,})([?:.,;]*?)").match("abc,. def....").groups()
  ('abc,. d', 'ef', '')
  </code></pre>
  
  <p>I've looked at questions dealing with end-of-string matching on SO and at the api docs (<a href="https://docs.python.org/2/library/re.html" rel="nofollow noreferrer">https://docs.python.org/2/library/re.html</a>).  So far, I don't quite understand, and would appreciate any help.</p>