【发布时间】:2016-10-24 20:43:44
【问题描述】:
我一直难以组织一个以我想要的方式处理字符串的函数。我已经研究了一些以前的问题1、2、3 以及我整理过的其他问题。这是设置,我有结构良好但可变的数据,需要从从文件读取的字符串拆分为字符串数组。下面展示了我正在处理的数据的一些示例
('Vdfbr76','gsdf','gsfd','',NULL),
('Vkdfb23l','gsfd','gsfg','ggg@df.gf',NULL),
('4asg0124e','Lead Actor/SFX MUA/Prop designer','John Smith','jsmith@email.com',NULL),
('asdguIux','Director, Camera Operator, Editor, VFX','John Smith','',NULL),
...
(492,'E1asegaZ1ox','Nysdag_5YmD','145872325372620',1,'long, string, with, commas'),
我想根据逗号拆分这些字符串,但是,字符串中偶尔会包含逗号,这会导致问题。除此之外,开发准确的re.split(regex, line) 变得困难,因为每行中的项目数在整个阅读过程中都会发生变化。
到目前为止我已经尝试过的一些解决方案。
def splitLine(text, fields, delimiter):
return_line = []
regex_string = "(.*?),"
for i in range(0,len(fields)-1):
regex_string+=("(.*)")
if i < len(fields)-2:
regex_string+=delimiter
return_line = re.split(regex_string, text)
return return_line
这将给出我们有以下输出的结果
regex_string
return_line
但是,这样做的主要问题是它有时会将两个字段混为一谈。在数组中的第三个值的情况下。
(.*?),(.*),(.*),(.*),(.*),(.*)
['', '\t(222', "'Vy1asdfnuJkA','Ndfbyz3_YMD'", "'14541242640005471'", '2', "'Hello World!')", '', '\n']
理想结果的样子:
['', '\t(222', "'Vy1asdfnuJkA'", "'Ndfbyz3_YMD'", "'14541242640005471'", '2', "'Hello World!')", '', '\n']
这是一个很小的变化,但它对结果的影响很大。我尝试操纵正则表达式字符串以更好地适应我正在尝试做的事情,但是我解决了每个案例,不幸的是另一个打破了它。
我玩过的另一个案例来自用户 Aaron Cronin 在这篇帖子 4 中,如下所示
def split_at(text, delimiter, opens='<([', closes='>)]', quotes='"\''):
result = []
buff = ""
level = 0
is_quoted = False
for char in text:
if char in delimiter and level == 0 and not is_quoted:
result.append(buff)
buff = ""
else:
buff += char
if char in opens:
level += 1
if char in closes:
level -= 1
if char in quotes:
is_quoted = not is_quoted
if not buff == "":
result.append(buff)
return result
结果如下:
["\t('Vk3NIasef366l','gsdasdf','gsfasfd','',NULL),\n"]
主要问题是它以相同的字符串出现。这让我陷入了反馈循环。
理想的结果应该是这样的:
[\t('Vk3NIasef366l','gsdasdf','gsfasfd','',NULL),\n]
感谢任何帮助,我不确定在这种情况下最好的方法是什么。我也很乐意澄清出现的任何问题。我尽量做到完整。
【问题讨论】:
-
从您给出的示例中,您的数据非常接近 CSV 格式和 Python 列表或元组格式。都是这样吗?要么替换前导和尾随
( )并将,NULL替换为空 -> 使用csv模块加载,要么将,NULL替换为空,然后使用ast.literal_eval- 它们是选项吗? -
@TessellatingHeckler 是的,他们是。我以前没有太多经验。被证明是一个非常简单的解决方案。见下文。