<p>正则表达式有几个问题,但主要的问题是在每个表达式的开头和结尾使用<code>^</code>和<code>$</code>。<code>^</code>表示匹配字符串的开头,<code>$</code>表示匹配字符串的结尾。除非字符串的长度与表达式的长度严格匹配,<code>findall</code>将不会匹配任何内容。你知道吗</p>
<p><strong>一个例子:</p>
<pre><code>In [55]: re.findall(r'^a$', 'abcdefghijkl')
Out[55]: [] # "a" is not matched!
</code></pre>
<p><code>^</code>和<code>$</code>应分别用于显式匹配字符串的开头和结尾(或在某些情况下,请参见<a href="http://www.python.org/doc//current/library/re.html" rel="nofollow">documentation</a>)。去掉这些,你的表达式就应该开始匹配了。你知道吗</p>
<p>以下是一些更具体的问题:</p>
<ul>
<li>在<code>^(man|tirs|ons|tors|fre|lør|søn)dag$</code>中,findall只捕获并返回第一部分(<code>man|tirs|ons|tors|fre|lør|søn</code>)。将其更改为<a href="http://docs.python.org/2/howto/regex.html#non-capturing-and-named-groups" rel="nofollow"><em>non capturing group</em></a>,以便返回整个表达式:<br/><br/><code>(?:man|tirs|ons|tors|fre|lør|søn)dag</code><br/><br/></li>
<li>在<code>^[neste].$</code>中,我假设您想要捕获字符串<code>"neste"</code>。当前您有一个集<code>[neste]</code>,它将匹配以下字符中的一个:<code>n</code>、<code>e</code>、<code>s</code>或<code>t</code>。将其更改为<code>neste</code>。<br/>关于集合的文档可以在<a href="http://docs.python.org/2/howto/regex.html#matching-characters" rel="nofollow">here</a>中找到。你知道吗</li>
<li><code>^([0-2][0-9]|3[0-1])$</code>基本上是好的,除了<code>^</code>和<code>$</code>,您可以省略<code>0</code>和<code>1</code>之间的连字符,排除括号,并使用数字符号<code>\d</code>(相当于<code>[0-9]</code>,但是:<br/><br/>^{<cd26><br/><br/></li>
<li>最后,在<code>'^([1-2][0-9][0-9][0-9])$'</code>(同样,除了<code>^</code>和<code>$</code>)中,表达式应该像预期的那样工作,但是您可以使它更加简洁。可以使用<a href="http://docs.python.org/2/howto/regex.html#repeating-things" rel="nofollow">curly bracket syntax</a>指定重复。因此,匹配1000-2999之间任何年份的字符串变为:<br/><br/>
<code>[12]\d{3}</code></li>
</ul>
<p>我建议你仔细阅读<a href="http://docs.python.org/2/howto/regex.html" rel="nofollow">HOWTO on Regular Expressions</a>。你知道吗</p>