不要用Python的字符串split()分割双引号中的词?

13 投票
3 回答
8675 浏览
提问于 2025-04-17 04:55

在使用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 个回答

0

我建议你使用 re 来查找模式 "[^"]*",然后只对剩下的部分使用字符串的分割功能。你可以实现一个递归函数,来处理所有相关的字符串部分。

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']
36

你不能通过 str.split() 来实现这个功能。如果你能接受它处理起来比较复杂的方式(比如会忽略前面有反斜杠的双引号),那么 shlex.split() 可能正是你需要的:

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

撰写回答