gpt4 book ai didi

python - 在 python : how to split newlines while ignoring newline inside quotes 中解析字符串

转载 作者:太空狗 更新时间:2023-10-30 01:48:47 25 4
gpt4 key购买 nike

我有一段文本需要用 python 解析。

这是一个字符串,我想将它拆分成一个行列表,但是,如果换行符 (\n) 在引号内,那么我们应该忽略它。

例如:

abcd efgh ijk\n1234 567"qqqq\n---" 890\n

应该被解析为以下行的列表:

abcd efgh ijk
1234 567"qqqq\n---" 890

我已经尝试使用 split('\n') 来实现它,但我不知道如何忽略引号。

有什么想法吗?

谢谢!

最佳答案

这里有一个更简单的解决方案。

匹配 (?:"[^"]*"|.)+ 组。即,“引号中的内容或不是换行符的内容”。

例子:

import re
re.findall('(?:"[^"]*"|.)+', text)

注意:这会将几个换行合并为一个,因为空行会被忽略。为避免这种情况,请同时给出一个空值:(?:"[^"]*"|.)+|(?!\Z)

(?!\Z) 是一种令人困惑的表达“不是字符串结尾”的方式。 (?! ) 是负先行; \Z 是“字符串结尾”部分。


测试:

import re

texts = (
'text',
'"text"',
'text\ntext',
'"text\ntext"',
'text"text\ntext"text',
'text"text\n"\ntext"text"',
'"\n"\ntext"text"',
'"\n"\n"\n"\n\n\n""\n"\n"'
)

line_matcher = re.compile('(?:"[^"]*"|.)+')

for text in texts:
print("{:>27} → {}".format(
text.replace("\n", "\\n"),
" [LINE] ".join(line_matcher.findall(text)).replace("\n", "\\n")
))

#>>> text → text
#>>> "text" → "text"
#>>> text\ntext → text [LINE] text
#>>> "text\ntext" → "text\ntext"
#>>> text"text\ntext"text → text"text\ntext"text
#>>> text"text\n"\ntext"text" → text"text\n" [LINE] text"text"
#>>> "\n"\ntext"text" → "\n" [LINE] text"text"
#>>> "\n"\n"\n"\n\n\n""\n"\n" → "\n" [LINE] "\n" [LINE] "" [LINE] "\n"

关于python - 在 python : how to split newlines while ignoring newline inside quotes 中解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com