我有一个问题。如何检查Python字符串中是否包含不在给定列表中的字符?
这是给定的列表(集合):
set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")
我有一个问题。如何检查Python字符串中是否包含不在给定列表中的字符?
这是给定的列表(集合):
set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")
当我需要验证字符串时,我通常使用正则表达式。
要创建一个集合,你需要将所有字符放在[]
中。
如果想检查字符串是否包含任何不在集合中的字符,则在开头添加^
。
如果要检查字符串是否包含一个或多个集合成员,则在末尾添加+
。
根据这些信息,检查一个字符串是否包含任何不是{a,b,c,d}中字符的正则表达式如下:
[^abcd]+
(注意大小写敏感)
在Python中使用正则表达式,需要import re
。 re.search(pattern, string, flags=0)
方法会在整个字符串中查找给定的模式。
<=
运算符可以测试一个集合是否是另一个集合的子集。import string
# don't use a mutable set for this purpose
GIVEN = frozenset(string.ascii_letters + string.digits + '-._')
def uses_other_chars(s, given=GIVEN):
return not set(s) <= given
示例:
>>> uses_other_chars('abc')
False
>>> uses_other_chars('Hello!')
True
set.issuperset
,它可以接受任何可迭代对象。 - Kelly Bundys
创建为集合,但是我刚刚检查过了,它仍然会这样做。烦死了。 - Kelly Bundyany
函数来检查字符串中每个字符是否在SET中SET = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")
s = "123#"
print(any(x not in SET for x in s))
set(s) - SET
呢? - thebjornany
在第一个非成员处停止。所以对于 s =“#123456789”
,你的方法会更慢。也许 SET.issuperset(s)
是最好的选择。 - Kelly Bundyre.compile(r"[^-._\w\d]")
。 - thebjornr"[^-.\w]"
,因为\w
包括数字和下划线。 - Kelly Bundyimport timeit
search_strings = [
'"#12"', # short string, early match
'"#1234567"', # longer string, early match
'"1234567#"', # longer string, late match
'"123" * 100 + "#"', # long string, late match
'"123#" * 100', # long string early match
]
algorithms = [
("r.search(s)", 's={};import re; r = re.compile(r"[^-.\w]")'),
("set(s) - SET", 's={};SET=frozenset("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")'),
("any(x not in SET for x in s)", 's={};SET=frozenset("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")'),
("SET.issuperset(s)", 's={};SET=frozenset("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._")'),
]
for alg, setup in algorithms:
print alg
for sstr in search_strings:
print "%35s %.3f" % (sstr[:35], timeit.timeit(alg, setup.format(sstr)))
r.search(s)
"#12" 0.470
"#1234567" 0.514
"1234567#" 0.572
"123" * 100 + "#" 3.493
"123#" * 100 0.502
set(s) - SET
"#12" 0.566
"#1234567" 1.045
"1234567#" 1.075
"123" * 100 + "#" 7.658
"123#" * 100 10.170
any(x not in SET for x in s)
"#12" 0.786
"#1234567" 0.797
"1234567#" 1.475
"123" * 100 + "#" 27.266
"123#" * 100 1.087
SET.issuperset(s)
"#12" 0.466
"#1234567" 0.864
"1234567#" 0.896
"123" * 100 + "#" 7.512
"123#" * 100 10.199