<p>regex不是一个很好的解决方案,因为它并不特别适合这样的测试,而且它也不容易配置、维护和扩展。你知道吗</p>
<p>更好的方法是编写一个单独的函数来测试单个输入<code>i</code>与可能的匹配<code>m</code>,如果</p>
<ol>
<li><code>len(i) >= minimum_length_required</code>,和</li>
<li>从<code>i</code>得到的数据与从<code>m</code>得到的长度匹配。你知道吗</li>
</ol>
<p>这适用于单字条目:</p>
<pre><code>def partialMatch(entry, full, minimum):
return len(entry) >= minimum and entry == full[:len(entry)]
>>> print (partialMatch('con', 'configure', 4))
False
>>> print (partialMatch('config', 'configure', 4))
True
>>> print (partialMatch('confiture', 'configure', 4))
False
</code></pre>
<p>但是使用多单词命令需要更多的工作,因为每个单独的单词都必须被检查——而且,大概还有一长串可能的命令。但是,总体思路应该是这样的:</p>
<pre><code>def validate(entry, cmd_list):
entry = entry.split()
if len(entry) != len(cmd_list):
return False
for index,word in enumerate(entry):
if not partialMatch(word, cmd_list[index].replace('#',''), cmd_list[index].find('#')):
return False
return True
</code></pre>
<p>其中<code>cmd_list</code>包含允许条目的列表,<code>#</code>字符与最小条目文本的位置匹配。所以你可以</p>
<pre><code>>>> print (validate ('conf', ['conf#igure', 't#erminal']))
False
>>> print (validate ('conf t', ['conf#igure', 't#erminal']))
True
>>> print (validate ('configure t', ['conf#igure', 't#erminal']))
True
>> print (validate ('conf #', ['conf#igure', 't#erminal']))
False
</code></pre>
<p>(当然,您通常不会将有效的命令存储在这个调用本身中,而是存储在一个较长的列表中,并在上面循环以查找有效的命令。)</p>