关于正则表达式:Python分隔线分裂问题

Python delimited line split problems

我正在努力根据变量分隔符拆分文本行,并保留空字段和引用数据。

示例:

1
1,"2",three,'four, 4',,"6\tsix"

或以制表符分隔的维西翁

1
1\t"2"\tthree\t'four, 4'\t\t"6\tsix"

两者都会导致:

1
['1', '"2"', 'three', 'four, 4', '',"6\tsix"]

到目前为止,我试过:

  • 使用split,但显然所引用的分隔符没有按需要处理。

  • 解决方案使用csv库,但它往往有选项可以引用所有内容或不引用任何内容,而不保留原始引用。

  • regex,特别是从下面的答案中遵循模式,但它会删除空字段:如何拆分但忽略在python中带引号的字符串中的分隔符?

  • 使用PyParsing库。我所管理的最好的方法如下,但这也会删除空字段(使用逗号分隔符示例):

    1
    2
    3
    4
    5
    s = '1,"2",three,\'four, 4\',,"6\tsix"'
    wordchars = (printables + ' \t

    '
    ).replace(',', '', 1)
    delimitedList(OneOrMore(quotedString | Word(wordchars)), ',').parseWithTabs().parseString(s)

  • 谢谢你的建议!


    这对我很有用:

    1
    2
    3
    4
    import pyparsing as pyp

    pyp.delimitedList(pyp.quotedString | pyp.SkipTo(',' | pyp.LineEnd()), ',') \
        .parseWithTabs().parseString(s)

    给予

    1
    ['1', '"2"', 'three',"'four, 4'", '', '"6\tsix"']

    避免创建带有空白字符或所有可打印字符的单词。Pyparlysis不做任何前瞻性工作,而且这些表达式可能包含比您计划的更多的内容。


    使用此模式匹配双引号外的逗号,(?=(?:(?:[^"]*\"){2})*[^"]*$)。演示

    编辑:要在双引号或引号之外拆分逗号,请使用此模式江户十一〔一〕号演示


    为什么说regex会丢弃空字段?艾伦·莫尔在参考文章中的回答建议

    1
    re.split(''';(?=(?:[^'"]|'[^']*'|"[^"]*")*$)''', data)

    我试了一下(在用,换了;之后),发现['1', '"2"', 'three',"'four, 4'", '', '"6\tsix"']和你说的一样