<h2>你的代码</h2>
<p>正如您所提到的,只要<code>any</code>字符是正确的,就立即追加单词。您需要检查它们是否正确:</p>
<pre><code>filtered_words = []
for word in words:
if all(char in alpha+digit+punct for char in word):
filtered_words.append(word)
print(filtered_words)
# ['Amuu2', 'Q1BFt', 'mgF)`', 'Y9^^M', 'W0PD7']
</code></pre>
<p>您还可以检查是否没有一个字符不正确:</p>
^{pr2}$
<p>但是它的可读性要差得多。在</p>
<p>为了提高效率,您不应该在每次迭代期间用<code>alpha+digit+punct</code>连接列表。你应该在任何循环之前做一次彻底的。从这些列表中创建一个集合也是一个好主意,因为当有许多允许的字符时,<code>char in set</code>比{<cd5>}快得多。在</p>
<p>最后,可以使用列表理解来避免for循环。如果你做了这些,你会得到<a href="https://stackoverflow.com/questions/45350567/python-check-if-list-item-does-not-contain-any-of-other-list-items/45350707#45350707">@timgeb's solution</a>:)</p>
<h2>可替代regex</h2>
<p>您可以从列表中创建regex模式并查看匹配的单词:</p>
<pre><code># encoding: utf-8
import string
import re
alpha = list(string.ascii_letters)
digit = list(string.digits)
punct = list(string.punctuation)
words = ["Amuu2", "Q1BFt", "dUM€n", "o°8o1G", "mgF)`", "ZR°p", "Y9^^M", "W0PD7"]
allowed_pattern = re.compile(
'^[' +
''.join(
re.escape(char) for char in (
alpha +
digit +
punct)) +
']+$')
# ^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^_\`\{\|\}\~]+$
print([word for word in words if allowed_pattern.match(word)])
# ['Amuu2', 'Q1BFt', 'mgF)`', 'Y9^^M', 'W0PD7']
</code></pre>
<p>你也可以写:</p>
<pre><code>print(list(filter(allowed_pattern.match, words)))
# ['Amuu2', 'Q1BFt', 'mgF)`', 'Y9^^M', 'W0PD7']
</code></pre>
<p><code>re.compile</code>可能比简单地初始化<code>set</code>需要更多的时间,但是过滤可能会更快。在</p>