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+)"
我有这个字符串:
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+)"