【问题标题】:Split by comma and how to exclude comma from quotes in split用逗号分隔以及如何在 split ... Python 中从引号中排除逗号
【发布时间】:2017-08-21 09:33:30
【问题描述】:

python 2.7 代码

cStr = '"aaaa","bbbb","ccc,ddd"' 

newStr = cStr.split(',')

print newStr 

# result : ['"aaaa"','"bbbb"','"ccc','ddd"' ]

但是,我想要这个结果。

result = ['"aaa"','"bbb"','"ccc,ddd"'] 

帮助..

【问题讨论】:

  • 为什么不在 " 上拆分然后删除所有大小为 1 的结果?
  • 你不能用 '\",\"' 分割吗?然后如果您仍然想要引号,请在之后添加它们。

标签: python split


【解决方案1】:

尽可能使用现有库总是更好,但我一直在努力让我的特定用例与上述所有答案一起工作,所以我为 python 3.9 编写了自己的(可能会工作到 3.6,并删除类型提示将使您获得 2.x 兼容性)。

def separate(string) -> List[str]:
    """
    Split a comma separated string into a List of strings.

    Resulting list elements are trimmed of double quotes.
    Comma's inside double quotes are ignored.

    :param string: A string to be split into chunks
    :return: A list of strings, one element for every chunk
    """
    comma_separated_list: List[str] = []

    chunk: str = ''
    in_quotes: bool = False

    for character in string:
        if character == ',' and not in_quotes:
            comma_separated_list.append(chunk)
            chunk = ''

        elif character == '"':
            in_quotes = False if in_quotes else True

        else:
            chunk += character

    comma_separated_list.append(chunk)
    return comma_separated_list

还有测试...

def test_separator():
    string = '"aaaa","bbbb","ccc,ddd"' 

    expected = ['"aaaa"', '"bbbb"', '"ccc,ddd"']
    actual = separate(string)

    assert expected == actual

【讨论】:

    【解决方案2】:

    通过使用正则表达式试试这个:

    COMMA_MATCHER = re.compile(r",(?=(?:[^\"']*[\"'][^\"']*[\"'])*[^\"']*$)")
    split_result = COMMA_MATCHER.split(string)
    

    【讨论】:

      【解决方案3】:

      这不是标准模块,您必须通过 pip 安装它,但作为一个选项尝试 tssplit:

      In [3]: from tssplit import tssplit
      In [4]: tssplit('"aaaa","bbbb","ccc,ddd"', quote='"', delimiter=',')                                                            
      Out[4]: ['aaaa', 'bbbb', 'ccc,ddd']
      

      【讨论】:

        【解决方案4】:

        尝试使用 CSV。

        import csv
        cStr = '"aaaa","bbbb","ccc,ddd"'
        newStr = [ '"{}"'.format(x) for x in list(csv.reader([cStr], delimiter=',', quotechar='"'))[0] ]
        
        print newStr
        

        查看Python parse CSV ignoring comma with double-quotes

        【讨论】:

        • 我建议使用“next(csv.reader([cStr]))”而不是“list(csv.reader([cStr]))[0]”。
        【解决方案5】:

        你可以先将字符串用"分割,然后过滤掉''',',最后格式化,这可能是最简单的方法:

        ['"%s"' % s for s in cStr.split('"') if s and s != ',']
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
        • 如果你使用split,你可以用一个字符串来分割,而不是一个字符:cStr[1:-1].split('","')
        【解决方案6】:

        pyparsing 有一个内置表达式,commaSeparatedList:

        cStr = '"aaaa","bbbb","ccc,ddd"' 
        import pyparsing as pp
        print(pp.commaSeparatedList.parseString(cStr).asList())
        

        打印:

        ['"aaaa"', '"bbbb"', '"ccc,ddd"']
        

        您还可以添加解析时操作来去除这些双引号(因为您可能只想要内容,而不是引号):

        csv_line = pp.commaSeparatedList.copy().addParseAction(pp.tokenMap(lambda s: s.strip('"')))
        print(csv_line.parseString(cStr).asList())
        

        给予:

        ['aaaa', 'bbbb', 'ccc,ddd']
        

        【讨论】:

        • 对于几年后阅读这篇文章的任何人,commaSeparatedList 已被弃用,取而代之的是 common.comma_separated_list
        【解决方案7】:

        在这种情况下使用正则表达式会更好。 re.findall('".*?"', cStr) 准确返回您需要的内容

        星号是贪心通配符,如果你使用'".*"',它将返回最大匹配,即第一个和最后一个双引号之间的所有内容。问号使其不贪婪,因此'".*?"' 返回可能的最小匹配。

        【讨论】:

          【解决方案8】:

          你需要一个解析器。您可以构建自己的,或者您可以将其中一个图书馆投入使用。在这种情况下,json 可以(ab)使用。

          import json
          
          cStr = '"aaaa","bbbb","ccc,ddd"' 
          jstr = '[' + cStr + ']'
          result = json.loads( jstr)             # ['aaaa', 'bbbb', 'ccc,ddd']
          result = [ '"'+r+'"' for r in result ] # ['"aaaa"', '"bbbb"', '"ccc,ddd"']
          

          【讨论】:

            【解决方案9】:

            使用re.split()函数的解决方案:

            import re
            
            cStr = '"aaaa","bbbb","ccc,ddd"'
            newStr = re.split(r',(?=")', cStr)
            
            print newStr
            

            输出:

            ['"aaaa"', '"bbbb"', '"ccc,ddd"']
            

            ,(?=") - 前瞻肯定断言,确保分隔符 , 后跟双引号 "

            【讨论】:

            • cha(10)后面跟“aaa”时如何拆分()?
            • @JongpyoJeon," Next chr(10) split 是什么意思?
            • alist = '"aaa","bbb","ccc,ddd" chr(10) "a-1","b-1","c-1"' 有 chr ( 10) 在 "ccc,ddd" 和 "a-1" 之间我想要...结果 = [ ["aaa","bbb","ccc,ddd"],["a-1","b-1" ,"c-1.....chr(10)xxx "] ]
            猜你喜欢
            • 1970-01-01
            • 2022-03-18
            • 1970-01-01
            • 1970-01-01
            • 2013-12-06
            • 2019-08-19
            • 1970-01-01
            • 2010-10-23
            • 2022-06-16
            相关资源
            最近更新 更多