gpt4 book ai didi

python:查找字符串中的第一个字符串

转载 作者:太空狗 更新时间:2023-10-30 01:00:19 24 4
gpt4 key购买 nike

给定一个字符串和一个子字符串列表,我想在字符串中出现任何子字符串的第一个位置。如果没有子串出现,返回0。我想忽略大小写。

有没有比以下更 pythonic 的东西:

given = 'Iamfoothegreat'
targets = ['foo', 'bar', 'grea', 'other']
res = len(given)
for t in targets:
i = given.lower().find(t)
if i > -1 and i < res:
res = i

if res == len(given):
result = 0
else:
result = res

该代码有效,但似乎效率低下。

最佳答案

使用正则表达式

另一个例子只是使用正则表达式,因为认为 python 正则表达式实现非常快。不是我的正则表达式函数是

import re

given = 'IamFoothegreat'
targets = ['foo', 'bar', 'grea', 'other']

targets = [re.escape(x) for x in targets]
pattern = r"%(pattern)s" % {'pattern' : "|".join(targets)}
firstMatch = next(re.finditer(pattern, given, re.IGNORECASE),None)
if firstMatch:
print firstMatch.start()
print firstMatch.group()

输出是

3
foo

如果没有找到输出什么也没有。应该 self 解释以检查是否未发现任何内容。

更正常而不是真正的 pythonic

也给你匹配的字符串

given = 'Iamfoothegreat'.lower()
targets = ['foo', 'bar', 'grea', 'other']

dct = {'pos' : - 1, 'string' : None};
given = given.lower()

for t in targets:
i = given.find(t)
if i > -1 and (i < list['pos'] or list['pos'] == -1):
dct['pos'] = i;
dct['string'] = t;

print dct

输出是:

{'pos': 3, 'string': 'foo'}

如果没有找到元素:

{'pos': -1, 'string': None}

两者的性能比较

用这个字符串和模式

given = "hello world" * 5000
given += "grea" + given
targets = ['foo', 'bar', 'grea', 'other']

1000 次带 timeit 的循环:

regex approach: 4.08629107475 sec for 1000
normal approach: 1.80048894882 sec for 1000

10 个循环。现在有了更大的目标(目标 * 1000):

normal approach: 4.06895017624 for 10
regex approach: 34.8153910637 for 10

关于python:查找字符串中的第一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com