Python字符串分割,处理单引号问题

4

我正在尝试通过“,”拆分字符串。 对于以下“example1”,“split”函数按预期正常工作。

example1 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc'"
example1.split(",")
Result: ['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc'"]

但是,这里有一个场景,在单引号内有逗号,我不想在逗号上拆分。

example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"
example2.split(",")
Result: ["1,'aaa',337.5,17195,.02,0,0,'yes','abc,", 'def,', "xyz'"]

我正在尝试获得以下结果:
['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc, def, xyz'"]

如何使用字符串分割函数实现此操作?

2
list(ast.literal_eval(example2)) 应该可以工作;这是一个有效的 Python 元组字面量。但一些上下文会帮助找出最佳解决方案。那个字符串来自哪里? - jonrsharpe
这是一种类似于CSV的已建立格式吗?如果不是,为什么不是呢?如果您对此有控制权,应该切换到使用已建立的格式,可能是JSON,以避免重新发明轮子。 - deceze
2个回答

7
您应该首先尝试使用内置函数或标准库将数据读入列表中,例如通过csv模块直接从CSV文件中读取。

如果您的字符串来自您无法控制的源,则添加开放和关闭方括号会产生有效的list,因此您可以使用ast.literal_eval

from ast import literal_eval

example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"

res = literal_eval(f'[{example2}]')

# [1, 'aaa', 337.5, 17195, 0.02, 0, 0, 'yes', 'abc, def, xyz']

这会将数值数据转换为整数或浮点数。如果您想将它们保留为字符串,按照 @JonClements 的评论,您可以传递给csv.reader:
import csv

res = next(csv.reader([example2], quotechar="'")) 

# ['1', 'aaa', '337.5', '17195', '.02', '0', '0', 'yes', 'abc, def, xyz']

1
请注意,如果确实需要将元素保留为字符串,而不是转换为其他Python类型,则可以使用 next(csv.reader([example2],quotechar =“'”)) - 而不是 ast.literal_eval - Jon Clements
1
@JonClements,非常好的观点。我做出了这样的假设,即OP希望将数字数据作为数字处理。 - jpp
好的 - 这对我来说也更有意义...但只是根据他们的 但我正在尝试获得这个结果: - Jon Clements
感谢jpp和@JonClements。目前将它们保留为字符串,但将其转换为适当的类型也是不错的选择。我会探索这个选项。 - Arun Nalpet
顺便说一下,@jpp的literal_eval是一个不错的选择,但似乎只适用于3.x版本。我目前正在使用2.x! - Arun Nalpet
1
@ArunNalpet literal_eval会很好用...你只是不能使用Python f-string (3.6+)...尝试使用res = literal_eval('[{}]'.format(example2))代替... - Jon Clements

0
假设您想在元素周围保留那些'(例如您期望的输出中的"'aaa'"而不是'aaa'),那么您可以使用以下函数来实现:
def spl(st, ch):
  res = []
  temp = []
  in_quote = False
  for x in st:
    if (x == "'"):
      in_quote = not in_quote

    if (not in_quote and x == ch):
      res.append("".join(temp))
      temp = []
    else:
      temp.append(x)

  res.append("".join(temp))
  return res




example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"

print(spl(example2, ','))

输出:

['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc, def, xyz'"]

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