解析python中的字符串:如何在忽略引号内的换行符的同时拆分换行符

Yuv*_*mon 4 python regex parsing

我有一个文本,我需要在python中解析.

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

例如:

abcd efgh ijk\n1234 567"qqqq\n---" 890\n
Run Code Online (Sandbox Code Playgroud)

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

abcd efgh ijk
1234 567"qqqq\n---" 890
Run Code Online (Sandbox Code Playgroud)

我已尝试过split('\n'),但我不知道如何忽略这些引号.

任何的想法?

谢谢!

Vee*_*rac 7

这是一个更容易的解决方案.

匹配组的(?:"[^"]*"|.)+.即,"引号中的东西或不是换行符的东西".

例:

import re
re.findall('(?:"[^"]*"|.)+', text)
Run Code Online (Sandbox Code Playgroud)

注意:这会将多个换行合并为一个,因为空行会被忽略.为了避免这种情况,也要给出一个空案例:(?:"[^"]*"|.)+|(?!\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"
Run Code Online (Sandbox Code Playgroud)