Изменить подстроки с несколькими значениями, используя смещение и длину
Я работаю над извлечением данных из OpenCalais API, и вот подробности:
Входные данные: некоторый абзац (строка, например, "Барак Обама является президентом Соединенных Штатов". Кроме того, возвращаются некоторые переменные экземпляра со смещениями и длинами, но не обязательно в порядке появления.
Вывод (я хочу): та же строка, но с идентифицированными экземплярами сущности с гиперссылками (которая также является строкой), т.е.
output="<a href="https://en.wikipedia.org/Barack_Obama"> Barack Obama </a> is the President of ""<a href="https://en.wikipedia.org/United_States"> United States. </a>"
НО ЭТО РЕАЛЬНЫЙ ВОПРОС ПИТОНА.
Это то, что у меня есть
#API CALLS ABOVE WHICH IS NOT RELEVANT.
output=input
for x in range(0,result.print_entities()):
print len(result.entities[x]["instances"])
previdx=0
idx=0
for y in range(0,len(result.entities[x]["instances"])):
try:
url= "https://permid.org/1-" + result.entities[x]['resolutions'][0]['permid']
except:
url="https://en.wikipedia.org/wiki/"+result.entities[x] ["name"].replace(" ", "_")
print "Generating wiki page link"
print url+"\n"
#THE PROBLEM STARTS HERE
offsetstr=result.entities[x]["instances"][y]["offset"]
lenstr=result.entities[x]["instances"][y]["length"]
output=output[:offsetstr]+"<a href=" + url + ">" + output[offsetstr:offsetstr+lenstr] + "</a>" + output[offsetstr+lenstr:]
print output
Теперь проблема в том, что если вы правильно прочитаете код, то узнаете, что после первой итерации выходная строка изменяется - поэтому для последующих итераций значения смещения больше не применяются таким же образом. Поэтому я не могу внести ожидаемые изменения.
В основном пытаюсь получить:
input = "Barack Obama is the President of United States"
output= "<a href="https://en.wikipedia.org/Barack_Obama"> Barack Obama </a> is the President of ""<a href="https://en.wikipedia.org/United_States"> United States. </a>."
Интересно, как это можно сделать? Попытка сращивания нарезать кубиками, но строка просто искажается.
2 ответа
Попробуйте использовать другую переменную для сохранения результата
output=input
res,preOffsetstr = [],0
for x in range(0,result.print_entities()):
print len(result.entities[x]["instances"])
previdx=0
idx=0
for y in range(0,len(result.entities[x]["instances"])):
try:
url= "https://permid.org/1-" + result.entities[x]['resolutions'][0]['permid']
except:
url="https://en.wikipedia.org/wiki/"+result.entities[x] ["name"].replace(" ", "_")
print "Generating wiki page link"
print url+"\n"
#THE PROBLEM STARTS HERE
offsetstr=result.entities[x]["instances"][y]["offset"]
lenstr=result.entities[x]["instances"][y]["length"]
res.append(output[preOffsetstr :offsetstr]+"<a href=" + url + ">" + output[offsetstr:offsetstr+lenstr] + "</a>" + output[offsetstr+lenstr:])
preOffsetstr = offsetstr
print '\n'.join(res)
Я наконец решил это. Взял некоторую основную математическую логику, чтобы сделать, но как мой последний комментарий с интуицией, что - "Может быть, решение может сохранить кортежи {offset, length} в массиве, а затем отсортировать его по значениям смещения, а затем запустить цикл. Любая помощь сделать эту структуру?" - Это сделало тик.
output=input
l=[]
for x in range(0,result.print_entities()):
print len(result.entities[x]["instances"])
for y in range(0,len(result.entities[x]["instances"])):
try:
url=r'"'+ "https://permid.org/1-" + result.entities[x]['resolutions'][0]['permid'] + r'"'
except:
url=r'"'+"https://en.wikipedia.org/wiki/"+result.entities[x]["name"].replace(" ", "_") + r'"'
print "Generating wiki page link"
#THE PROBLEM WAS HERE
offsetstr=result.entities[x]["instances"][y]["offset"]
lenstr=result.entities[x]["instances"][y]["length"]
#The KEY TO THE SOLUTION IS HERE
l.append((offsetstr,lenstr,url))
# res.append(output[preOffsetstr:offsetstr]+"<a href=" + url + ">" + output[offsetstr:offsetstr+lenstr] + "</a>" + output[offsetstr+lenstr:])
print l
def getKey(item):
return item[0]
l_sorted=sorted(l, key=getKey)
a=[]
o=[]
x=0
p=0
#And then simply run a for loop
for x in range(0,len(l_sorted)):
p=x+1
try:
o=output[l_sorted[x][0]+l_sorted[x][1]:l_sorted[x][0]] + "<a href=" + str(l_sorted[x][2]) + ">" + output[l_sorted[x][0]:(l_sorted[x][0]+l_sorted[x][1])] + "</a>" + output[l_sorted[x][0]+l_sorted[x][1]:(l_sorted[p][0]-1)]
a.append(o)
except:
print ""
#+ output[l_sorted[x][0]+l_sorted[x][1]:]
#a.append(output[l_sorted[len(l_sorted)][0]] + l_sorted[len(l_sorted)][1]:l_sorted[len(l_sorted)][0]] + "<a href=" + str(l_sorted[len(l_sorted)][2]) + ">" + output[l_sorted[len(l_sorted)][0]:(l_sorted[len(l_sorted)][0]+l_sorted[len(l_sorted)][1])] + "</a>" + output[l_sorted[len(l_sorted)][0]+l_sorted[len(l_sorted)][1]:]
m=output[l_sorted[len(l_sorted)-1][0]+l_sorted[len(l_sorted)-1][1]:l_sorted[len(l_sorted)-1][0]] + "<a href=" + str(l_sorted[len(l_sorted)-1][2]) + ">" + output[l_sorted[len(l_sorted)-1][0]:(l_sorted[len(l_sorted)-1][0]+l_sorted[len(l_sorted)-1][1])] + "</a>" + output[l_sorted[len(l_sorted)-1][0]+l_sorted[len(l_sorted)-1][1]:]
a.append(m)
print " ".join(a)
И УОЛЛА!:) - Спасибо за помощь, ребята. Надеюсь, это поможет кому-нибудь когда-нибудь.