【问题标题】:Don't split double-quoted words with Python string split()?不要用 Python 字符串 split() 分割双引号的单词?
【发布时间】:2011-12-14 11:19:17
【问题描述】:

在使用 Python 字符串函数 split() 时,是否有人有一个巧妙的技巧可以将双引号包围的项目视为非拆分词?

假设我只想在空白处分割,我有这个:

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P   Q" R'
>>> myStr.split()
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R']

我想将双引号中的任何内容视为一个单词,即使嵌入了空格,所以我想以以下结尾:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P   Q', 'R']

或者至少这个,然后我会去掉双引号:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P   Q"', 'R']

任何非正则表达式建议?

【问题讨论】:

    标签: python string split


    【解决方案1】:

    您将无法使用str.split() 获得此行为。如果您可以接受它所做的相当复杂的解析(例如忽略反斜杠前面的双引号),shlex.split() 可能就是您要寻找的:

    >>> shlex.split(myStr)
    ['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P   Q', 'R']
    

    【讨论】:

    • 谢谢你,Sven --- 这正是我要找的!
    • 很棒,很有帮助。谢谢!
    【解决方案2】:

    @Rob:如果正则表达式解决方案如此简单,为什么没有正则表达式?

    my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P   Q" R'
    print re.findall(r'(\w+|".*?")', my_str)
    ['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P   Q"', 'R']
    

    【讨论】:

    • @PabloG - 尽管经常是前期简单的解决方案,但我个人还没有遇到过正则表达式没有更多长期成本的情况。至于这个具体案例,我很确定这是一个已解决的问题,我可以找到它 --- Sven 似乎用 shlex 为我指明了正确的方向。
    【解决方案3】:

    我建议您使用re 搜索模式“[^”]*”并仅在其余部分上应用 string.split。您可以实现一个处理所有相关字符串部分的递归函数。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多