Python中动态数组listings[]行为不符合预期的问题排查
批量文本替换异常的原因分析
核心问题
你代码里的致命错误是第一次循环时对listings的赋值逻辑:
- 初始
listings = []是个空列表,但每次循环里listings = re.sub(...)会把它直接覆盖成单个字符串。 - 三次循环结束后,
listings已经不是列表了,而是最后一次替换得到的字符串:'This string3 needs new_word'
为什么会出现"仅输出前几个字符"的现象
第二次循环里zip(word, listings),这里的listings是字符串,Python会把字符串当成字符序列来遍历。word有3个元素,所以zip会取字符串的前3个字符'T'、'h'、'i'分别和new_word1、new_word2、new_word3配对。
- 每次循环里
re.sub(wordsRegex, x, y),y是单个字符,根本匹配不上正则(\S+_\S+[a-z]),所以直接返回原字符,最后listings就变成了这三个字符的拼接,也就是你看到的'Thi'。
修正后的代码
把第一次循环里的赋值改成列表追加操作,同时修正第二次循环的赋值逻辑:
# concurrentTest.py import re subString = [' string1',' string2',' string3'] word = ['new_word1', 'new_word2', 'new_word3'] lineString = ['This line, needs new_word','This line, needs new_word', 'This line, needs new_word'] # 匹配带下划线的单词 wordsRegex = "(\\S+_\\S+[a-z])" # 匹配以逗号结尾的单词(带前置空格) stringRegex = "(\\s[a-z]+,)" # 存储结果的列表 listings = [] # 第一次替换:将每一行的修改结果追加到列表 for (x, y) in zip(subString, lineString): modified_line = re.sub(stringRegex, x, y) listings.append(modified_line) # 第二次替换:遍历列表中的每一行,替换后更新对应位置的元素 for idx, (x, y) in enumerate(zip(word, listings)): listings[idx] = re.sub(wordsRegex, x, y) # 输出验证结果 for line in listings: print(line)
补充说明
- 列表是可变容器,要存储多个结果必须用
append()、extend()这类方法,直接赋值会彻底覆盖原有变量的类型和内容。 - 第二次循环如果直接用
listings = re.sub(...),同样会把列表覆盖成单个字符串,所以要用索引修改列表内的元素,或者新建一个独立的结果列表。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

