我在前面为标题道歉,我不确定如何说出问题。
我试图在两个不同但相似的字符串中找到类似字符或字符集的索引。
I <color=red><b>really</b></color> don't like spiders!
I really don't like spiders!
相关文字相同,但A
有一些格式,而B
则没有。我通过B
并运行正则表达式来查找并用空字符串替换所有A
,从而得到<contents>
。
现在假设我在B
中的索引为9的位置选择了一个字符,这将是单词d
中的字母don't
。然后我如何在字符串A
中确定d
中的don't
字母还需要选择,其索引为35(如果我计算正确的话)?
编辑:可能是重要的信息,这些标签适用于Unity中的富文本。几乎在所有方面都与HTML非常相似。
答案 0 :(得分:1)
正如我在评论中已经建议的那样,您应该为此格式编写自己的解析器,将格式设置为文本旁边的元数据。例如,您可以保留一个简单的字符串部分列表,其中每个部分表示具有相同格式的连续文本。
你可以从简单化的东西开始:
import re
def parse (string):
it = iter([None] + re.split('(<[^>]+>)', string))
parsed = []
curFormat = {}
for fmt, text in zip(it, it):
if fmt is None:
curFormat = {}
elif fmt.startswith('</'):
fmt = fmt[2:-1]
del curFormat[fmt]
else:
fmt = fmt[1:-1]
if '=' in fmt:
name, value = fmt.split('=', 1)
curFormat[name] = value
else:
curFormat[fmt] = True
if text != '':
parsed.append((text, list(curFormat.items())))
return parsed
对于您的文字,这将给您以下结果:
>>> text = "I <color=red><b>really</b></color> don't like spiders!"
>>> parsed = parse(text)
>>> parsed
[('I ', []), ('really', [('color', 'red'), ('b', True)]), (" don't like spiders!", [])]
如您所见,您可以获得一对文本,以及该文本特定部分的格式信息列表。如果您想获取基础文本,则可以迭代第一个列表元素:
>>> ''.join(t for t, fmt in parsed)
"I really don't like spiders!"
除此之外,您还可以创建自己的索引方法(请注意,这个方法非常粗糙):
def index (parsed, start, length):
output = ''
for t, fmt in parsed:
if start < 0:
output += t
elif start > len(t):
start -= len(t)
else:
output += t[start:]
start = -1
if len(output) > length:
return output[:length]
return output
>>> index(parsed, 4, 5)
'ally '
>>> index(parsed, 7, 6)
"y don'"
最后,你可以把它全部放在一个自定义类型中,它实现了迭代器协议和senquence协议,所以你可以像普通字符串一样使用它。