将字符串 python 的切片替换为不同大小的字符串,但保持结构



所以今天我正在研究一个函数,该函数从数据块中删除任何带引号的字符串,并用格式区域替换它们({0}{1}等...(。
我遇到了一个问题,因为输出变得完全混乱,就像在一个看似随机的地方进行{1}一样。
我后来发现这是一个问题,因为替换列表中的切片会更改列表,使其长度不同,因此之前的re匹配项不会对齐(它仅适用于第一次迭代(。
正如预期的那样,琴弦的收集工作非常完美,因为这肯定不是re的问题。
我读过关于可变序列的信息,以及许多其他东西,但找不到任何关于这方面的内容。
我认为我需要的是类似str.replace的东西,但可以取切片,而不是子字符串。
这是我的代码:

import re
def rm_strings_from_data(data):
regex = re.compile(r'"(.*?)"')
s = regex.finditer(data)
list_data = list(data)
val = 0
strings = []
for i in s:
string = i.group()
start, end = i.span()
strings.append(string)
list_data[start:end] = '{%d}' % val
val += 1
print(strings, ''.join(list_data), sep='nn')
if __name__ == '__main__':
rm_strings_from_data('[hi="hello!" thing="a thing!" other="other thing"]')

我得到:

['"hello!"', '"a thing!"', '"other thing"']
[hi={0} thing="a th{1}r="other thing{2}

我想要输出:

['"hello!"', '"a thing!"', '"other thing"']
[hi={0} thing={1} other={2}]

任何帮助将不胜感激。 感谢您抽出宝贵时间:)

为什么不使用正则表达式捕获组匹配两个部分key=value,如下所示:(w+?)=(".*?")
然后根据需要组合列表变得非常容易。

示例代码:

import re
def rm_strings_from_data(data):
regex = re.compile(r'(w+?)=(".*?")')
matches = regex.finditer(data)
strings = []
list_data = []
for matchNum, match in enumerate(matches):
matchNum = matchNum + 1
strings.append(match.group(2))
list_data.append((match.group(1) + '={' + str(matchNum) + '} '))
print(strings, '[' + ''.join(list_data) + ']', sep='nn')
if __name__ == '__main__':
rm_strings_from_data('[hi="hello!" thing="a thing!" other="other thing"]')

最新更新