我正在寻找一种方法来查找句子中的某个字符串,并返回该字符串第一个字母的索引号。当然,这看起来很简单,但我偶然发现了一个我似乎找不到解决方案的问题。这项任务的难点是试图找到原始句子的索引号。所以任务是找到句子中的字符串,对于第一个例子,这是没有问题的,因为国家在第一个空格之前开始,但是对于第二个例子,情况并非如此。
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,因为中间有空格。我想过尝试计算中间非字母字符的数量,但不太清楚如何做到这一点。
然后我尝试了一些过于复杂的循环,似乎工作得很好,但我相信肯定有一个更复杂的解决方案,然后这个复杂的结构。
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函数在原始句子中查找的方法,但当它到达非字母字符时,它会忽略它或继续搜索,直到一个alpa字符搞砸了它。
对于缩进可能出现的错误,我深表歉意,这是我第一次在这里粘贴代码。
发布于 2018-11-03 16:43:59
使用regex库可以很容易地解决这个问题。
请阅读正则表达式库docs的正则表达式模式运算符部分和标志部分。
一旦你有了这个,就执行[pattern].search(target_string)
。将输出保存到一个变量中-如果它匹配,您将获得一个匹配对象。
对于匹配的对象,您将能够通过在保存匹配对象的变量上请求.group(0).start
或group(0).end
来找到开始和结束。
编辑:我已经意识到我所说的大部分都是错误的,如果单词/ if是未知的,那么用正则表达式以正常的方式解决问题就不是那么容易了。@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
发布于 2018-11-03 16:48:31
您可以使用以下正则表达式进行搜索。这些正则表达式可以通过使用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())
发布于 2018-11-03 19:05:14
谢谢你们的回复。我相信你指的是这样的东西?
for charac in search:
if charac.isalpha():
regexpr += '[' + charac.lower() + '][\ ]*'
q = re.compile(regexpr)
indexnr = re.search(q, sentence).start()
我还在努力学习reg的表达方式。例如,如果我没有弄错,如果我也想忽略逗号,我应该用我自己的表达式修改\*。
编辑:如果你只是评论,有没有可能也格式化你的代码?没有立即找到,所以我不得不回答我自己的问题
https://stackoverflow.com/questions/53133038
复制相似问题