按上下文敏感的方式分隔字符串

2 投票
7 回答
1394 浏览
提问于 2025-04-15 12:22

比如,我想把

str = '"a,b,c",d,e,f'

分开成

["a,b,c",'d','e','f']

(也就是说,不要把引号里的部分分开)在这种情况下,可以用

re.findall('".*?"|[^,]+',str)

来实现。不过,如果

str = '"a,,b,c",d,,f'

我想要

["a,,b,c",'d','','f']

也就是说,我想要的效果就像Python的split函数那样。有没有办法可以用一行(小)代码做到这一点,可能用到Python的re库?

其实,我刚刚在这个网站上意识到,csv模块非常适合我想做的事情,但我还是很好奇,re库有没有可以做到这一点的正则表达式。

7 个回答

1

为这个写一个状态机看起来会比较简单。确定性有限自动机(DFA)和正则表达式(regex)其实是有相同的能力,但通常它们中的一个会更适合当前的问题,这通常还取决于你可能需要实现的额外逻辑。

2

使用csv模块,因为它是一个真正的解析器。正则表达式在大多数情况下并不理想(或者根本不适合)用来匹配分隔符,尤其是当规则变化的时候(我不确定这个特定的语法是否是正则的)。你可能能写出一个正则表达式来处理这种情况,但会相当复杂(特别是像“He said, \"How are you\"”这样的情况)。

2
re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', str)

在找到一个逗号之后,如果前面有奇数个引号,那么这个逗号一定是在一对引号里面,所以它不算作分隔符。显然,这里没有考虑到转义引号的情况,但如果需要的话也可以处理,只是这样会让正则表达式变得比现在复杂两倍。:D

撰写回答