当前位置: 首页 > 面试题库 >

在python中分割逗号分隔的字符串

丌官向荣
2023-03-14
问题内容

这个问题已经被问过很多次了。一些例子:[1],[2]。但是似乎没有更一般的东西。我正在寻找的是一种在引号或定界符对之内的逗号分隔字符串的方法。例如:

s1 = 'obj<1, 2, 3>, x(4, 5), "msg, with comma"'

应该分为三个元素的列表

['obj<1, 2, 3>', 'x(4, 5)', '"msg, with comma"']

现在的问题是,由于我们可以查看成对的<>和,因此这可能变得更加复杂()

s2 = 'obj<1, sub<6, 7>, 3>, x(4, y(8, 9), 5), "msg, with comma"'

应该分为:

['obj<1, sub<6, 7>, 3>', 'x(4, y(8, 9), 5)', '"msg, with comma"']

0,当我们到达s2[3]我们遇到<这将增加平价1。当遇到奇偶只会减少>或者)当它遇到它会增加<(`。当奇偶校验不为0时,我们可以简单地忽略逗号而不进行任何拆分。

这里的问题是,使用正则表达式可以快速解决此问题吗?我确实在研究此解决方案,但似乎并不涵盖我所给出的示例。

一个更通用的函数将是这样的:

def split_at(text, delimiter, exceptions):
    """Split text at the specified delimiter if the delimiter is not
    within the exceptions"""

一些用途是这样的:

split_at('obj<1, 2, 3>, x(4, 5), "msg, with comma"', ',', [('<', '>'), ('(', ')'), ('"', '"')]

正则表达式将能够处理此问题,还是有必要创建专门的解析器?


问题答案:

虽然不可能使用正则表达式,但是以下简单代码将实现所需的结果:

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

在解释器中运行此命令:

>>> split_at('obj<1, 2, 3>, x(4, 5), "msg, with comma"', ',')                                                                                                                                 
#=>['obj<1, 2, 3>', ' x(4, 5)', ' "msg with comma"']


 类似资料:
  • 问题内容: 我有一个长度未知的字符串,看起来像这样 将这些字符串用逗号分隔的最佳方法是什么,以便每个单词都可以成为的元素? 例如 问题答案: 你可以这样做: 基本上,该方法将根据你正在传递的(在这种情况下)定界符来分割字符串,并将返回字符串数组。 但是,你似乎位于字符串列表而不是数组之后,因此必须使用该实用程序将数组转换为列表。就像供你参考一样,你也可以这样做: 但是通常最好是对接口进行编程,而不

  • 问题内容: 我有一个模糊的字符串,像这样: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。) 上面的字符串应分为: 注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体

  • 问题内容: 我有这样一个字符串: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。 上面的字符串应分为: 问题答案: 可以使用正则表达式 输出:

  • 问题内容: 我有一个像这样的字符串: 上面的字符串应分为: 问题答案: 我认为最简单的解决方案是处理输入字符串char-by-char: 例: 作为免费赠品,此解决方案还根据需要计算嵌套括号: 它还检查括号是否平衡(每个开放的括号都有相应的结束符)。

  • 问题内容: 我需要将逗号分隔的字符串拆分为第二列,我具有下表: 我想将逗号后的数字分成第二列POS2,所以它应该像这样 所以我查询了以下内容: 问题答案: MySQL没有内置功能。相当于MySQL。 使用可能是更简洁的方法。这样的事情(免责声明:未经测试): 用于POS 用于POS2 顺便说一句,我可能会误解您要完成的工作,但看起来您可能想要现有的行,而不是新的行?就像是:

  • 问题内容: 更新: 有人将此问题标记为“如何分割字符串,以便我可以访问项目x”的重复项。但这是不同的,我的问题是关于Sybase SQL Anywhere,另一个是关于MS SQLServer。这是两个不同的SQL引擎,即使它们具有相同的来源,也具有不同的语法。因此它不是重复的。我首先在描述和标记中写了所有关于 SybaseSQL Anywhere的内容 。 我有田野 我想用它来搜索该字段: 是

  • 问题内容: 这是我的表结构: 我需要拆分该列,并希望通过一个简单的sql查询来做到这一点,因为我不知道如何使用函数,并且希望将其保持简单。 这是我已经发现的: 但这仅输出 有没有一种方法来拆分一切从到,,等? 提前致谢。 问题答案:

  • 问题内容: 我有以下字符串: 我“肯定”想“上学”。 现在,我想在省略号处分割此字符串,即我想获得以下输出: 我会 一定 喜欢 上学 。 问题答案: 如果您是用引号()代替省略号,最简单的解决方案是使用 :