我正在寻找一种方法来在句子中查找某个字符串,然后返回该字符串首个字母的索引号。尽管这似乎很容易,但我偶然发现了一个似乎找不到解决方案的问题。任务中的困难是试图找到原始句子的索引号。因此,任务是在句子中查找字符串,对于第一个示例,这是没有问题的,因为国家/地区在第一个空格之前开始,但是对于第二个,则不是这种情况。
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函数在原始句子中查找的方法,但是当到达非字母字符时,它会忽略它或继续搜索直到阿尔帕字符将其拧紧。
对于缩进的任何可能的错误表示歉意,这是我第一次在这里粘贴代码。
答案 0 :(得分:0)
这可以通过正则表达式库轻松解决。
阅读正则表达式模式运算符部分和标志部分 正则表达式库docs。
一旦有了这个,请执行
[pattern].search(target_string)
。保存 输出到变量-如果匹配,您将获得一个匹配对象。使用匹配的对象,您将可以找到开始和结束 在变量您上询问
.group(0).start
或group(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表达式。如果我没记错的话,例如,如果我也想忽略逗号,则应使用自己的表达式权限修改[\] *。
编辑:如果您只是注释,是否也可以格式化代码?没有立即找到它,所以不得不回答我自己的问题