如何在Python中查找字符串中某个单词的索引位置

20
word = 'laugh'    
string = 'This is laughing laugh'
index = string.find ( word )

索引为8,应该是17。 我仔细找了一圈,但没有找到答案。


我是Python新手,re对我来说太复杂了,我还无法解决这个问题! - Khan
1
当我搜索“如何在字符串中查找单词”时,在这个网站上我发现了194个问题。你是在说所有这些答案都没有帮助吗? - Bryan Oakley
1
8是正确的答案,find返回第一个匹配子字符串的起始位置。 - miraculixx
3
这回答解决了你的问题吗?在字符串中查找单词位置 - Abu Shoeb
5个回答

41
使用正则表达式(带单词边界)应该作为替代方案,因为 str.find 只会返回第一个匹配项。然后使用match 对象的start属性获取起始索引。
import re

string = 'This is laughing laugh'

a = re.search(r'\b(laugh)\b', string)
print(a.start())
>> 17
你可以在这里找到有关它如何工作的更多信息。

太好了!你能告诉我如何在正则表达式中使用变量吗?比如说,我想用单词而不是(laugh)? - Khan
4
你可以像处理任何 Python 字符串一样操作它。你可以使用拼接或 .format 方法,例如 word = 'laugh' ; re.search(r'\b({})\b'.format(word), string) - DeepSpace
1
这个可以工作:re.compile(r'\b%s\b' % word, re.I),不确定为什么re.search(r'\b({})\b‌​'.format(word), string)没有... - Khan
1
非常感谢!我花了很多时间来研究这个(新手!) - Khan

7

试试这个:

word = 'laugh'    
string = 'This is laughing laugh'.split(" ")
index = string.index(word)

这会生成包含所有单词的列表,然后搜索相关的单词。然后我想你可以将小于索引的所有元素的长度相加,以此方式找到您的索引

position = 0
for i,word in enumerate(string):
    position += (1 + len(word))
    if i>=index:
        break

print position  

希望这有所帮助。

4

以下是一种无需使用正则表达式的方法:

word = 'laugh'    
string = 'This is laughing laugh'
# we want to find this >>> -----
# index   0123456789012345678901     
words = string.split(' ')
word_index = words.index(word)
index = sum(len(x) + 1 for i, x in enumerate(words) 
            if i < word_index) 
=> 17

这将字符串切割成单词,找到匹配单词的索引,然后将长度与空格字符作为分隔符的所有单词的长度相加。

更新 另一种方法是以下一行代码:

index = string.center(len(string) + 2, ' ').find(word.center(len(word) + 2, ' '))

这里的stringword都被左右填充了空格,以便在字符串的任何位置捕获完整单词。

当然,为了提高性能和方便起见,您应该使用正则表达式。使用re模块的等效代码如下:

r = re.compile(r'\b%s\b' % word, re.I)
m = r.search(string)
index = m.start()

这里的\b表示单词边界,详见re文档。正则表达式可能会让人畏惧。一个很好的测试和查找正则表达式的方法是使用regex101.com


不管你们怎么踩,但请加上评论以便我改进答案。 - miraculixx
1
r = re.compile(r'\b%s\b' % word, re.I) 运行得非常好。你的完整解决方案也很有效!非常感谢! - Khan
下投票的原因是这个答案(两部分)已经以非常相似的形式存在。 - XtrmJosh
@XtrmJosh 我自己想出了这些解决方案和整个答案。而且如果你仔细看,这个确切的解决方案没有被任何其他人发布过。 - miraculixx
index = sum(len(x) + 1 for i, x in enumerate(words) if i < word_index) 这段代码没有给出正确的字符索引。 - Rashmi Jain
显示剩余3条评论

1

代码中的字符串没有空格。如果你想找到空格,必须将空格包含在你要搜索的单词中。你可能会发现将字符串分割成单词然后迭代会更有效率,例如:

str = "This is a laughing laugh"
strList = str.split(" ")
for sWord in strList:
    if sWord == "laugh":
        DoStuff()

当你迭代时,可以将当前单词的长度添加到索引中,当找到该单词时,退出循环。不要忘记考虑空格!

我可以找到字符串中的单词,我想知道它的索引。 - Khan
我的错,你可以在迭代时添加每个单词的长度。这可能比列出的正则表达式方法效率低,但我尽量避免在Python中使用正则表达式 - 我认为它是一种脚本语言,应该保持易于阅读而不是高性能。 - XtrmJosh

0

我偶然发现了这个问题。希望你现在已经解决了它。如果你还没有解决,也许这会有所帮助。我和你一样遇到了同样的困境,试图使用索引打印出一个单词。

string = 'This is laughing laugh'
word = string.split(" ")
print(word[02])

这将打印出 laughing
希望这能有所帮助。这是我第一次在这个论坛回答问题,请见谅我的语法。
谢谢。

以下代码在Python 3中会失败:"SyntaxError: 十进制整数字面量中不允许前导零" - ShpielMeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接