A question from 2011, back when SO allowed more free-form discussion questions.<p>An obvious thought is, given that most of the comments are about Python 2, what&#x27;s changed in Python 3? The top answer (chained comparisons), hasn&#x27;t changed. Indeed, I&#x27;ve only noticed a couple of changes.<p>re.DEBUG is not something I knew about. It does look handy, though watch out for the cache. Interestingly, one thing has changed. Under Python 2, &quot;a * &quot; was identical to &quot;a{0,65535}&quot;, where the maximum value 65535 was taken to mean &#x27;unlimited&#x27;.<p><pre><code>  &gt;&gt;&gt; import re
  &gt;&gt;&gt; pat = re.compile(&quot;a*&quot;)
  &gt;&gt;&gt; s = &quot;a&quot;*65555
  &gt;&gt;&gt; len(pat.match(s).group(0))
  65555
  &gt;&gt;&gt; pat = re.compile(&quot;a{0,65535}&quot;)  # this is equivalent to &quot;a*&quot;
  &gt;&gt;&gt; len(pat.match(s).group(0))   # I expect 65535!
  65555
  &gt;&gt;&gt; pat = re.compile(&quot;a{0,65534}&quot;)
  max_repeat 0 65534
    literal 97
  &gt;&gt;&gt; len(pat.match(s).group(0))
  65534
</code></pre>
Under Python 3.x, &quot;a * &quot; is now {0,4294967295} instead of {0,65535}.<p>The only other changes I noticed on the first page are that print is no longer a statement, and &quot;rot13&quot; is no longer an encoding.