私があなたの質問から得たように、あなたは平文の索引を知っている手紙の後ろに何かをHTMLコードに挿入したいと思います。その場合、最も簡単な解決策は、すべてのhtmlタグを無視し、それらの外側の文字だけを数えることだと思います。あなたはこのようにそれを行うことができます:
def insertInHtml(string, insstr, position):
ctr=0
insidetag=False
for ci in range(len(string)):
if string[ci]=='<':
insidetag=True
elif string[ci]=='>':
insidetag=False
else:
if not insidetag: ctr+=1
if ctr==position+1:
HTMLIndex=ci
break
return string[0:HTMLIndex] + insstr + string[HTMLIndex:]
この関数は、HTMLタグ内にない「string」引数として関数に渡されるHTML文字列の文字数をカウントします。'position'引数として関数に渡した数値をヒットすると、カウントループが中断し、関数は指定した位置の文字の後ろの文字列を分割します。次に、それらの部分の間にinsstr文字列を挿入し、新しい文字列を返します。指定されたインデックスがテキストの長さより大きい場合、エラーが発生します。
編集:JFセバスティアンが指摘したように、htmlの属性にコメント(<で始まる行、感嘆符、2つのダッシュ)またはリテラル<がある場合、これは失敗します。両方のケースを処理する関数は次のとおりです。
def insertInHtml(string, insstr, position):
ctr=0
insidetag=False
insideattr=False
for ci in range(len(string)):
suchar=''
if not ci==len(string)-1: suchar=string[ci+1]
if string[ci]=='<' and not insideattr:
insidetag=True
elif (string[ci]=='>' and not insideattr) or (string[ci]=='-' and string[ci-2:ci]=='!-'):
insidetag=False
elif insidetag and string[ci]+suchar=='="':
insideattr=True
elif insideattr and string[ci]=='"':
insideattr=False
else:
if not insidetag: ctr+=1
if ctr==position+1:
HTMLIndex=ci
break
return string[0:HTMLIndex] + insstr + string[HTMLIndex:]
あまりクリーンなコードではありませんが、十分に理解できるはずです。