【发布时间】:2013-10-19 07:25:00
【问题描述】:
我有一组字符:\,/,?,% 等。 我也有一个字符串,可以说“这是我的字符串 % 我的字符串?”
我想检查字符串中是否存在任何字符。
这不是检查子字符串,而是检查集合中的字符。
我可以这样做:
my_str.find( "/" ) or my_str.find( "\\" ) or my_str.find( "?" )
但它非常丑陋和低效。
有没有更好的办法?
【问题讨论】:
标签: python
我有一组字符:\,/,?,% 等。 我也有一个字符串,可以说“这是我的字符串 % 我的字符串?”
我想检查字符串中是否存在任何字符。
这不是检查子字符串,而是检查集合中的字符。
我可以这样做:
my_str.find( "/" ) or my_str.find( "\\" ) or my_str.find( "?" )
但它非常丑陋和低效。
有没有更好的办法?
【问题讨论】:
标签: python
你可以在这里使用any。
>>> string = r"/\?%"
>>> test = "This is my string % my string ?"
>>> any(elem in test for elem in string)
True
>>> test2 = "Just a test string"
>>> any(elem in test2 for elem in string)
False
【讨论】:
r'/\?%*:|"<>. '。我相信它有你想要的所有角色。
any(elem in string for elem in test)而不是其他方式大约。正如您所拥有的那样,您将用尽整个(较长的)输入值,只寻找集合中的第一个字符,然后再继续下一个,依此类推。我刚刚给出的代码 sn-p 检查输入中每个字符的候选对象的 all,然后再继续下一个。这允许更频繁地提前放弃,假设目标都有一定的可能性。
elem in test——两者都是字符串——它会进行子字符串搜索。这可能会更慢,但更灵活。 for elem in string 可以从列表(或其他可迭代对象)中获取字符串,而不是从源字符串中将元素绘制为单独的符号。
我认为 Sukrit 可能给出了最 Pythonic 的答案。但是你也可以通过集合操作来解决这个问题:
>>> test_characters = frozenset(r"/\?%")
>>> test = "This is my string % my string ?"
>>> bool(set(test) & test_characters)
True
>>> test2 = "Just a test string"
>>> bool(set(test2) & test_characters)
False
【讨论】:
if 语句,bool() 调用是不必要的。即if set(test2) & test_characters:。 test_characters 也不需要被冻结。
string 替换为要查找的子字符串列表。基于set 的方法只能查找单个字符(严格来说,Unicode 代码点),因为它不再对字符串使用in 运算符(它执行子字符串搜索,与测试单个元素的列表不同)。
使用正则表达式!
import re
def check_existence(text):
return bool(re.search(r'[\\/?%]', text))
text1 = "This is my string % my string ?"
text2 = "This is my string my string"
print check_existence(text1)
print check_existence(text2)
【讨论】:
In [1]: import re
In [2]: RE = re.compile('[\\\/\?%]')
In [3]: RE.search('abc')
In [4]: RE.search('abc?')
Out[4]: <_sre.SRE_Match at 0x1081bc1d0>
In [5]: RE.search('\\/asd')
Out[5]: <_sre.SRE_Match at 0x1081bc3d8>
None 表示集合中的非字符存在于目标字符串中。
【讨论】:
当然也是最非 Pythonic 的方式,但至少对我来说更具可读性。
定义函数:
def containsSpecialCharacters(self, string: str, test: str) -> bool:
for special in string:
if special in test:
return True
return False
这个电话:
string = r"/\?%"
test = "This is my string % my string ?"
print(self.containsSpecialCharacters(string, test))
返回真
这个电话
test2 = "Just a test string"
print(self.containsSpecialCharacters(string, test2))
返回假
【讨论】: