【发布时间】:2015-06-12 01:01:18
【问题描述】:
更具体地说,如果我有这样的字符串:
string = "app-_l#e"
现在,允许使用所有字母、数字、连字符和下划线;尽管其他任何字符都不是。
是否有过滤掉指定类型和/或单个字符的功能?
【问题讨论】:
更具体地说,如果我有这样的字符串:
string = "app-_l#e"
现在,允许使用所有字母、数字、连字符和下划线;尽管其他任何字符都不是。
是否有过滤掉指定类型和/或单个字符的功能?
【问题讨论】:
您可以使用str.translate 从字符串中删除允许的字符,如果字符串中只有允许的字符或禁止字符的字符串,则留下一个空字符串:
from string import ascii_letters, digits
s = "app-_l#e"
# if the string is empty
if not s.translate(None, "-_" + ascii_letters + digits):
# string only contains allowed characters
翻译后您的输入字符串将如下所示:
In [7]: from string import ascii_letters, digits
In [8]: s = "app-_l#e"
In [9]: s.translate(None, "-_" + ascii_letters + digits)
Out[9]: '#'
或者保留一个set 的允许字符:
from string import ascii_letters, digits
allowed = set("-_" + ascii_letters + digits)
s = "app-_l#e"
if all(ch in allowed for ch in s):
# string only contains allowed characters
你想找出字符串中有哪些禁止字符,要么是print s.translate(None, "-_" + ascii_letters + digits),要么只包含任何不允许的字符,或者在for循环中迭代:
from string import ascii_letters, digits
allowed = set("-_" + ascii_letters + digits)
s = "app-_l#e"
disallowed = [ch for ch in s if ch not in allowed]
【讨论】:
set(s) <= allowed
allowed.issuperset(s)?
issubset 一样容易地弄错<=,并且无论哪种方式,您都可以轻松地发现并修复它。 Padraic 的重点不在于您使用哪一对运算符/方法,而在于您设置哪一个:两者中只有一个需要是一个集合,而另一个可以是任何可迭代的,并且转换 allowed 会产生更多有意义,因为您只在所有程序中执行一次,而不是每个字符串检查一次。
您可以使用re,但请注意,它会更慢。
>>> import re
>>> pat = re.compile(r'[\d|\w|\-|_]+$')
>>> if pat.match("app-_l#e"):
... print True
... else:
... print False
...
False
还有一个匹配的例子
>>> if pat.match("apple123_-"):
... print True
... else:
... print False
...
True
【讨论】:
.match() 中使用^,它总是从头开始。最好不要使用.match(),而是使用.search()。
match 的初衷是它会从一开始就发现它。但是是的 ^ 不是必需的。这是相当多余的。再次感谢您的关注。 :)