不要使用Python字符串分割函数split()来分割双引号括起来的单词?

13

当使用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']

有没有不使用正则表达式的建议?

3个回答

36

使用 str.split() 无法得到这种行为。如果您可以接受它相对复杂的解析(比如忽略斜杠前面的双引号),那么 shlex.split() 可能是您要找的。

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

4

@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指引了我正确的方向。 - Rob

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接