在使用finditer时striplines()无效
我正在尝试把一个多行字符串转换成一个单一的列表,理论上可以用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 个回答
这个问题和 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
你的新问题也和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会为你打印出的格式。