如何确定两个长度不同的字符串之间的同一字符集的索引?

本文关键字:字符串 之间 索引 字符集 何确定 两个 | 更新日期: 2023-09-27 17:54:32

我先为这个标题道歉,我不知道该如何表达这个问题。

我正在尝试查找两个不同但相似的字符串中相似字符或字符集的索引。

  • 字符串A: I <color=red><b>really</b></color> don't like spiders!
  • 字符串B: I really don't like spiders!

相关文本是相同的,但是A有一些格式化,而B没有。我通过采取A并运行正则表达式来查找和替换所有<contents>与空字符串来获得B

现在假设我在B中选择了一个索引为9的字符,这将是单词don't中的字母d。然后我怎么能确定在字符串A中,don't中的字母d也需要被选择,这是在35的索引(如果我计数正确)?

编辑:可能是重要的信息,这些标签是Unity内的富文本。在几乎所有方面都与HTML非常相似

如何确定两个长度不同的字符串之间的同一字符集的索引?

正如我在评论中已经建议的那样,您应该为这种格式编写自己的解析器,将格式作为文本旁边的元数据。例如,您可以保留一个简单的字符串部分列表,其中每个部分表示具有相同格式的连续文本。

你可以这样简单的开始:

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'"

最后,您可以将所有这些都放入自定义类型中,该类型实现了迭代器协议和序列协议,因此您可以像使用普通字符串一样使用它。