Python 基于位置获取字符串中字符的单词

Python 基于位置获取字符串中字符的单词,python,regex,string,re,Python,Regex,String,Re,我有一个字符串,例如: “这是我非常无聊的字符串” 此外,我在字符串中有一个字符的位置,没有空格 e、 g: 位置13,在本例中与单词中的o匹配 我需要的是,根据我得到的索引(13)返回单词(无聊) 此代码将返回字符(o): 但出于某种原因,我想不出一个好办法来回报无聊这个词 任何帮助都将不胜感激 您可以使用regex\w+匹配单词,并不断累积匹配的长度,直到总长度超过目标位置: def get_word_at(string, position): length = 0 for

我有一个字符串,例如:

“这是我非常无聊的字符串”

此外,我在字符串中有一个字符的位置,没有空格

e、 g:

位置13,在本例中与单词
中的
o
匹配

我需要的是,根据我得到的索引(13)返回单词(无聊)

此代码将返回字符(
o
):

但出于某种原因,我想不出一个好办法来回报无聊这个词


任何帮助都将不胜感激

您可以使用regex
\w+
匹配单词,并不断累积匹配的长度,直到总长度超过目标位置:

def get_word_at(string, position):
    length = 0
    for word in re.findall(r'\w+', string):
        length += len(word)
        if length > position:
            return word
因此,
get\u word\u at('这是我非常无聊的字符串',13)
将返回:

boring

您可以使用regex
\w+
匹配单词,并不断累积匹配的长度,直到总长度超过目标位置:

def get_word_at(string, position):
    length = 0
    for word in re.findall(r'\w+', string):
        length += len(word)
        if length > position:
            return word
因此,
get\u word\u at('这是我非常无聊的字符串',13)
将返回:

boring

此函数将接受两个参数:字符串和索引 它会将索引转换为与原始字符串等效的相同索引 然后,它将返回转换索引的字符在原始字符串中所属的单词

def find(string,idx):
    # Find the index of the character relative original string
    i1 = idx
    for char in string:
        if char == ' ':
            i1 += 1
        if string[i1] == string.replace(' ','')[idx]:
            break

    # Find which word the index belongs to in the original string
    i2 = 0
    for word in string.split():
        for l in word:
            i2 += 1
            if i2 == i1:
                return(word)
        i2+=1

print(find("This is my very boring string", 13))
输出:

boring

此函数将接受两个参数:字符串和索引 它会将索引转换为与原始字符串等效的相同索引 然后,它将返回转换索引的字符在原始字符串中所属的单词

def find(string,idx):
    # Find the index of the character relative original string
    i1 = idx
    for char in string:
        if char == ' ':
            i1 += 1
        if string[i1] == string.replace(' ','')[idx]:
            break

    # Find which word the index belongs to in the original string
    i2 = 0
    for word in string.split():
        for l in word:
            i2 += 1
            if i2 == i1:
                return(word)
        i2+=1

print(find("This is my very boring string", 13))
输出:

boring

您可以安装并使用该模块,该模块支持具有可变长度lookbehind的模式,以便您可以使用该模式来断言匹配的单词后面正好有所需数量的单词字符(可选地由空格包围):

import regex
regex.search(r'\w*(?<=^\s*(\w\s*){13})\w+', 'This is my very boring string').group()

您可以安装并使用该模块,该模块支持具有可变长度lookbehind的模式,以便您可以使用该模式来断言匹配的单词后面正好有所需数量的单词字符(可选地由空格包围):

import regex
regex.search(r'\w*(?<=^\s*(\w\s*){13})\w+', 'This is my very boring string').group()

不需要慢而难看的var长度查找。
使用简单的前瞻和捕获组将获得单词

此正则表达式使用非空白字符作为字符

^(?:\s*(?=)

如果需要,请使用单词,但无论字符是什么,它都必须
与反字符一起使用,否则将不起作用,
它将停止,因为无法匹配所有字符

示例:

  • \w与\w一起使用
  • \s与\s一起使用


不需要缓慢且难看的变量长度查找。
使用简单的前瞻和捕获组将获得单词

此正则表达式使用非空白字符作为字符

^(?:\s*(?=)

如果需要,请使用单词,但无论字符是什么,它都必须
与反字符一起使用,否则将不起作用,
它将停止,因为无法匹配所有字符

示例:

  • \w与\w一起使用
  • \s与\s一起使用


一种非正则表达式的解决方案,力求OP想要的优雅:

def word_out_of_string(string, character_index):
    words = string.split()

    while words and character_index >= len(words[0]):
        character_index -= len(words.pop(0))

    return words.pop(0) if words else None

print(word_out_of_string("This is my very boring string", 13))

一个非正则表达式的解决方案,力求OP所期望的优雅:

def word_out_of_string(string, character_index):
    words = string.split()

    while words and character_index >= len(words[0]):
        character_index -= len(words.pop(0))

    return words.pop(0) if words else None

print(word_out_of_string("This is my very boring string", 13))

如果使用Python的替代正则表达式引擎,可以用空字符串替换以下正则表达式的匹配项:

r'^(?:\s*\S){0,13}\s|(?<=(?:\s*\S){13,})\s.*'

如果使用Python的替代正则表达式引擎,可以用空字符串替换以下正则表达式的匹配项:

r'^(?:\s*\S){0,13}\s|(?<=(?:\s*\S){13,})\s.*'


它解决了问题。但是必须有一种更优雅的方法来解决这个问题,不是吗?它解决了问题。但是必须有一种更优雅的方法来解决这个问题,不是吗?如果给定的字符串中有重复的字符,这将不起作用。如果给定的字符串中有重复的字符,这将不起作用。这是可行的,但是为什么不使用白色呢空格作为字符计数,其中第13个字母可能是e?如果第13个字母是标点符号呢?这是可行的,但是为什么空格不作为字符计数,其中第13个字母可能是e?如果第13个字母是标点符号呢?你能发一个链接到一个网站来演示这个吗?@Edward是的,请在这里运行演示:为什么是可变长度的lookbehind,不是真的需要,如果不使用反词,它就不起作用了!你可以在你的答案中加入演示链接,使其非只读,这样读者就可以看到当
13
发生变化时会发生什么。你能发一个链接到一个网站来证明这一点吗?@Edward是的,请求请在此运行演示:为什么不使用
\w
反单词就无法使用变长lookbehind,这不是真正需要的,而且它也不起作用呢?\w反单词完全不起作用!您可以将演示链接包含在您的答案中,并使其成为非只读链接,以便读者可以看到
13
更改时会发生什么。说到“丑陋”英语可能不是你的第一语言,但英语101 everywhere告诉我们,句子以大写字母开头,以终止符结尾。“whick”、“putt”、“donter”和“possibelre”不是单词。“putt”是懒惰的。请尊重语言。很好的解决方案,+1。请注意,问题中的
13
指的是索引13,而不是第13个非空格字符,因此在您的情况下,您必须使用
{14}
相反。这真的几乎是一个“另一个词”,天才的回答,不是吗?正如我现在告诉你的那样::当quant为1时,match和最后一个字母是
T
,第1组返回的单词是
This
。当设置为18时,match是
这是我非常无聊的
最后一个字母是
g
第1组返回的单词s
无聊
说到“丑陋”,你需要在你的答案中重写课文。英语可能不会