这个问题以前已经被问过和回答过很多次。一些例子: [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"']
没有使用正则表达式的朴素解决方案是通过查找字符
,<(
来解析字符串。如果找到<
或(
中的任何一个,则开始计算奇偶性。只有当奇偶性为零时,我们才能在逗号处分割。例如,假设我们想要拆分s2
,我们可以从parity = 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"', ',', [('<', '>'), ('(', ')'), ('"', '"')]
正则表达式能够处理这个问题吗,还是需要创建一个专门的解析器?
csv
模块会为您完成大部分工作。 - Slater Victoroff<>()
。 - HamZa