返回句子中某个字符串的索引号

时间:2018-11-03 16:01:16

标签: python

我正在寻找一种方法来在句子中查找某个字符串,然后返回该字符串首个字母的索引号。尽管这似乎很容易,但我偶然发现了一个似乎找不到解决方案的问题。任务中的困难是试图找到原始句子的索引号。因此,任务是在句子中查找字符串,对于第一个示例,这是没有问题的,因为国家/地区在第一个空格之前开始,但是对于第二个,则不是这种情况。

search = 'Mali' 
sentence = 'Panama lies in Central America.'

search = 'Poland'
sentence = 'The criminal was arrested by Interpol and the local police.'

所以我首先写了这个简单的代码:

indexnumber = sentence.lower().find(search.lower())

第一个正确返回4,第二个正确返回29(我需要34),因为它不计算非Alpa字符的数量。寻找原始句子obv给我一个-1,因为它们之间有空格。我曾想过要计算介于两者之间的非字母字符的数量,但还不知道该怎么做。

然后,我尝试了一些过于复杂的循环,这些循环似乎可以正常工作,但是我敢肯定,对于这种复杂的构造,必须有一个更加Python化的解决方案。

counter = 0
indexnr = 0
possible = []
search = search.replace(" ", "")

for charac in sentence:
    if counter <= len(search) - 1 and charac.isalpha():
        if charac.lower() == search.lower()[counter]:
            counter += 1
            possible += [indexnr]
        else:
            counter = 0
            possible = []
    indexnr += 1

print(possible[0])

基本上,这是一个for循环,当句子中的字母等于搜索中的第一个字母时创建一个列表,然后查找搜索中的第二个字母,依此类推,直到完全匹配且长度等于该列表等于搜索的长度,也就是完全匹配。如果不完全匹配,我会将计数器重置为0,然后再次清除列表。

尽管这可行,但我正在寻找一种更简单的解决方案,例如一种告诉find函数在原始句子中查找的方法,但是当到达非字母字符时,它会忽略它或继续搜索直到阿尔帕字符将其拧紧。

对于缩进的任何可能的错误表示歉意,这是我第一次在这里粘贴代码。

3 个答案:

答案 0 :(得分:0)

  

这可以通过正则表达式库轻松解决。

     

阅读正则表达式模式运算符部分和标志部分   正则表达式库docs

     

一旦有了这个,请执行[pattern].search(target_string)。保存   输出到变量-如果匹配,您将获得一个匹配对象。

     

使用匹配的对象,您将可以找到开始和结束   在变量您上询问.group(0).startgroup(0).end   将匹配对象另存为。

编辑: 我已经意识到我所说的大部分内容都是错误的,如果使用边界/一词来进行正则表达式的正常解决不是那么容易IES是未知的。 @ user2849789的答案更好,并且确实支持正则表达式,但是如果有人在寻找不需要正则表达式的另一种解决方案:

search = 'Poland'
sentence = 'The criminal was arrested by Interpol and the local police.'

srch = search.lower()

sentce = sentence.lower()

indexNr = 0

while indexNr < len(sentce):
    print("sentce[indexNr]=", sentce[indexNr]) #debug
    if sentce[indexNr] == srch[0]:
        print("Found starting char: ", srch[0])
        srchNr = 1
        spaces = 0
        while sentce[(indexNr + srchNr + spaces)] == srch[srchNr] or sentce[(indexNr + srchNr)] == " ":
            print(f"Searching for match! Search char is currently", srch[srchNr], "sentce[(indexNr + srchNr + spaces)] is '" + sentce[(indexNr + srchNr + spaces)] + "'")
            if sentce[(indexNr + srchNr + spaces)] == srch[-1]:
                print("Found word irrelevant of word boundaries! Starting index is ", indexNr)
                break
                #return indexNr
            elif sentce[indexNr + srchNr + spaces] == srch[srchNr]:
                #increment nested while loop counter
                srchNr += 1
            elif sentce[(indexNr + srchNr + spaces)] == " ":
                spaces += 1
    indexNr += 1

答案 1 :(得分:0)

您可以使用以下正则表达式进行搜索。可以使用for循环来创建这些正则表达式。

通过以下链接进行检查:https://regexr.com/42eq1

我不认为会有更好的选择:|

[\] *-搜索0个或多个空格。

search = 'Mali'
sentence1 = 'Panama lies in Central America.'

search = 'Poland'
sentence = 'The criminal was arrested by Interpol and the local police.'


p = re.compile("[m][\ ]*[a][\ ]*[l][\ ]*[i]")
p = re.compile("[p][\ ]*[o][\ ]*[l][\ ]*[a][\ ]*[n][\ ]*[d]")

indexnumber = sentence.lower().find(search.lower())
print(indexnumber)
print(re.search(p,sentence).start())

答案 2 :(得分:0)

感谢大家的回应。我相信你的意思是这样的吗?

for charac in search:
    if charac.isalpha():
        regexpr += '[' + charac.lower() + '][\ ]*'

q = re.compile(regexpr)

indexnr = re.search(q, sentence).start()

我仍在尝试学习reg表达式。如果我没记错的话,例如,如果我也想忽略逗号,则应使用自己的表达式权限修改[\] *。

编辑:如果您只是注释,是否也可以格式化代码?没有立即找到它,所以不得不回答我自己的问题