基本上,我有一个我正在搜索字符串的子字符串列表。我现在正在使用any(),如果在字符串中找到了其中一个单词,那就做一些工作。我想开始记录比赛以保持比赛的一些统计数据。我现在正在使用any()。
有没有办法做同样的事情,但将匹配存储在变量中?我每10秒抓取并搜索多达100个字符串,以获得25-30个子字符串列表。我唯一能想到的是遍历每个字符串列表中的每个子字符串,但我不确定该方法的性能影响。
答案 0 :(得分:1)
有多种方法可以做到这一点。正则表达式(正如FreddieV4建议的那样)非常强大。
然而,另一种简单的方法是使用列表理解,如:
matches = [x for x in string.split() if x in substrings]
将循环遍历字符串中的单词并检查单词是否适合其中一个子字符串,如果是,则返回,因此可用于记录目的。
您甚至可以进一步扩展它以将字符串列表作为输入而不是单个字符串处理 - 所有这些都在单个列表推导中。
一个广泛的例子如下所示:
substrings = ["cool","test","notpresent"]
#get matches for a single string
string = "This is a basic test"
matches = [x for x in string.split() if x in substrings]
print(matches)
# >> ['test']
#get matches for multiple strings
strings = ["I am so awesome", "you are cool", "I think so", "Yep this is a test"]
matches = [x for string in strings for x in string.split() if x in substrings]
print(matches)
# >> ['cool', 'test']
答案 1 :(得分:1)
让我们来看看这个例子:
s = "Thisisarandomstringthatiwanttotype"
subst = ["This", "random", "hullo", "type"]
返回匹配的所有子字符串:
filter(lambda x: x in s, subs)
>> ['This', 'random', 'type']
要返回匹配的子字符串的起始索引,可以将从上面的代码段返回的字符串列表传递给map函数以查找其索引:
map(lambda x: s.index(x), filter(lambda x: x in s, subs))
>> [0, 7, 30]
同样,您可以使用过滤器上的映射来检查返回字符串的长度:
map(lambda x: len(x), filter(lambda x: x in s, subs))
>> [4, 6, 4]
或者找到返回的最长子字符串的长度:
max(filter(lambda x: x in s, subst), key=len)
>> 'random'
答案 2 :(得分:0)
对于这类事情,您可以使用re
模块。
>>> import re
>>> m = re.search(r"substring1, substring2, substring3", string)
string
将是您正在搜索的字符串,而m
将是包含与您正在寻找的任何子字符串相匹配的字符串组的变量,即{{1} }};你也可以使用RegEx模式而不是子串。