在使用finditer时striplines()无效

-1 投票
2 回答
5323 浏览
提问于 2025-04-18 16:29

我正在尝试把一个多行字符串转换成一个单一的列表,理论上可以用splitlines()来实现,但不知道为什么它总是把每一行变成一个列表,而不是一次性处理所有行。我试着把它放在for循环外面,但似乎没有什么效果。我需要把这些行作为一个单一的列表,以便在另一个函数中使用。下面是我如何把多行字符串放到一个变量里的。请问我漏掉了什么???

multiline_string_final = []
for match_multiline in re.finditer(r'(^(\w+):\sThis particular string\s*|This particular string\s*)\{\s(\w+)\s\{(.*?)\}', string, re.DOTALL):
    multi_line_string = match_multiline.group(4)
    print multiline_string

这个最后的打印语句输出的字符串是这样的:

blah=0; blah_blah=1; Foo=3;
blah=4; blah_blah=5; Foo=0;

但是我需要的是:

['blah=0; blah_blah=1; Foo=3;''blah=4; blah_blah=5; Foo=0;']

我知道这可能和finditer有关,但我似乎无法解决这个问题。

2 个回答

0

这个问题和 finditer 没关系,关键在于你做错了事情:

for line in multiline_string:
    print multiline_string.splitlines()

如果 multiline_string 确实是一个多行字符串,那么 for line in multiline_string 实际上是逐个字符地遍历这个字符串。

而在这个循环里,你完全忽略了 line,反而用 print multiline_string.splitlines()) 来打印。

所以,如果 multiline_string 是这样的:

abc
def

那么你会连续打印 ['abc\n', 'def\n'] 8 次。这并不是你想要的结果(也不是你描述的那样)。

你想要做的是:

  • 把字符串分割成多行
  • 遍历这些行,而不是遍历原始的未分割字符串
  • 打印每一行,而不是整个字符串

所以:

for line in multiline_string.splitlines():
    print line
1

你的新问题finditer没有关系。(另外,你的代码仍然不是一个最小可复现示例,还是没有给我们展示样本输入数据等,这让我们更难帮助你。)

从你想要的输出来看:

['blah=0; blah_blah=1; Foo=3;''blah=4; blah_blah=5; Foo=0;']

我很确定你想要的是得到一个匹配项的列表,而不是把每个匹配项单独打印出来。这个输出不是一个有效的列表,因为元素之间缺少逗号,*但我假设这是你在编造数据时的一个小错误,而不是构建一个最小可复现示例并复制粘贴真实输出。

无论如何,要得到一个列表,你必须构建一个列表。把东西打印到屏幕上并不会构建任何东西。所以,试试这个:

multiline_string_final.append(multiline_string)

然后,在最后——不是在循环内部,只有在循环结束后——你可以把它打印出来:

print multiline_string_final

这样看起来会是这样的:

['blah=0; blah_blah=1; Foo=3;',
 'blah=4; blah_blah=5; Foo=0;']

* 实际上,它一个有效的列表,因为相邻的字符串会被连接在一起……但这不是你想要的字符串,也不是Python会为你打印出的格式。

撰写回答