<p>您的正则表达式也匹配子字符串;您需要添加开始和结束锚定。你知道吗</p>
<p>如果仅匹配整个字符串,请使用:</p>
<pre><code>^(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)$
</code></pre>
<p>否则,请使用负面环视:</p>
<pre><code>(?<!\d)(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)(?!\d)
</code></pre>
<p>其中,<code>(?<!\d)</code>防止模式在匹配的文本前面有数字时匹配,而<code>(?!\d)</code>防止模式在文本后面有数字时匹配。你知道吗</p>
<p><a href="https://pythex.org/?regex=%28%3F%3C!%5Cd%29%28%3FP%3Cmonth%3E%5B1-9%5D%7C1%5B012%5D%29%2F%28%3FP%3Cday%3E%28%5B0-2%5D%29%3F%5B1-9%5D%7C3%5B01%5D%29%2F%28%3FP%3Cyear%3E%28%5B0-2%5D%5Cd%29%2a%5Cd%5Cd%29%28%3F!%5Cd%29&test_string=Match%3A%201%2F1%2F2000%2C%201%2F1%2F00%2C%201%2F01%2F00%2C%201%2F31%2F00%2C%202%2F31%2F2000%2C%201%2F1%2F0000%20%0ANot%20Match%3A%2005%2F1%2F00%2C%2013%2F1%2F00%2C%202%2F005%2F00%2C%201%2F32%2F00%2C%201%2F1%2F200%2C%201%2F1%2F20000%2C%205%2F0%2F2000%20%0A&ignorecase=0&multiline=0&dotall=0&verbose=0" rel="nofollow">Pythex demonstration</a>使用后一种形式。你知道吗</p>
<p>演示:</p>
<pre><code>>>> import re
>>> dates = re.compile(r'(?<!\d)(?P<month>[1-9]|1[012])/(?P<day>([0-2])?[1-9]|3[01])/(?P<year>([0-2]\d)*\d\d)(?!\d)')
>>> dates.findall('Match: 1/1/2000, 1/1/00, 1/01/00, 1/31/00, 2/31/2000, 1/1/0000')
[('1', '1', '', '2000', '20'), ('1', '1', '', '00', ''), ('1', '01', '0', '00', ''), ('1', '31', '', '00', ''), ('2', '31', '', '2000', '20'), ('1', '1', '', '0000', '00')]
>>> dates.findall('Not Match: 05/1/00, 13/1/00, 2/005/00, 1/32/00, 1/1/200, 1/1/20000, 5/0/2000 ')
[]
</code></pre>