Python:查找字符串中特定字号的起始索引

Python: find the start index of a specific word number in a string

我有这个字符串:

myString = "Tomorrow will be very very rainy"

我想获取第 5 个单词(非常)的起始索引。

我目前所做的,是将 myString 拆分成单词:

words = re.findall( r'\w+|[^\s\w]+', myString)

但我不确定如何获取第 5 个单词的起始索引:words[5]。

使用 index() 无效,因为它找到了第一个匹配项:

start_index = myString.index(words[5])

不是很优雅,但是循环遍历拆分词列表并根据单词长度和拆分字符(在本例中为space)计算索引。此答案将针对句子中的第五个单词。

myString = "Tomorrow will be very very rainy"

target_word = 5

split_string = myString.split()

idx_start = 0

for i in range(target_word-1):
    idx_start += len(split_string[i])
    if myString[idx_start] == " ":
        idx_start += 1

idx_end = idx_start + len(split_string[target_word-1]) + 1

print(idx_start, idx_end, myString[idx_start:idx_end])

如果单词之间只有一个空格:

  • 将所需单词之前的所有单词长度相加
  • 添加空格数量
word_idx = 4  # zero based index
words = myString.split()
start_index = sum(len(word) for word in words[:word_idx]) + word_idx

结果:

22
wordnum = 5
l = [x.span()[1] for x in re.finditer(" +", string)]
pos = l[wordnum-2]
print(pos)

输出

22

如果字符串以5个字开头,可以匹配前4个字,捕获第5个字。

您可以使用 start 方法并将 1 传递给它作为 Match Object 的第一个捕获组。

^(?:\w+\s+){4}(\w+)

说明

  • ^ 字符串开头
  • (?:\w+\s+){4} 重复 4 次匹配 1+ 个单词字符和 1+ 个空白字符
  • (\w+)捕获组1,匹配1+个单词字符

例子

import re

myString = "Tomorrow will be very very rainy"
pattern = r"^(?:\w+\s+){4}(\w+)"
m = re.match(pattern, myString)
if m:
    print(m.start(1))

输出

22

对于更广泛的匹配,您可以使用 \S+ 来匹配一个或多个非空白字符。

pattern = r"^(?:\S+\s+){4}(\S+)"