使用regex模式拆分csv(重复?)



我是RegEx的新手,我有一个问题。这看起来很简单,但无论我怎么做,它都不起作用。

我有两行:

aaa,bbb,111,22.3,2021-01-01 4:4:4.444
ccc,ddd,555,66.7,2021-02-02 8:8:8.888

这个正则表达式符合我的要求:(.+),(.+),(.+),(.+),(.+)=>2个匹配5组

*Match 0 :*
group 1 = aaa

group 2 = bbb

...

group 5 = 2021-01-01 4:4:4.444
*Match 1 :*

group 1 = ccc

...

但是如果我有超过5个"字段"这将是复杂的。我怎么能得到和(.+),"n repetitions"(.+)一样的结果呢?还是别的什么?我尝试了{n}*,但这不是预期的结果。我还尝试了其他帖子中的一些正则表达式:

  • Regex拆分CSV

  • 重复正则表达式的部分?

所有的修改测试不匹配我的第一个简单的正则表达式( *(.+),(.+),(.+),(.+),(.+)* )

编辑:我最终会选择python解决方案。谢谢大家

一种简单的方法是使用str.join()创建正则表达式。

num_cols = 5
re_str = ','.join(['(.+)'] * num_cols)
rexp = re.compile(re_str)
teststr = """aaa,bbb,111,22.3,2021-01-01 4:4:4.444
ccc,ddd,555,66.7,2021-02-02 8:8:8.888"""
re.findall(rexp, teststr)

这给:

[('aaa', 'bbb', '111', '22.3', '2021-01-01 4:4:4.444'),
('ccc', 'ddd', '555', '66.7', '2021-02-02 8:8:8.888')]

您可以更改num_cols以使您的正则表达式匹配csv中的任意数量的列。

请记住,这种方法不会考虑CSV中的引号,引号应该表明引号中的逗号不是列分隔符。如果您想要好的、简单的CSV解析,只需使用csv模块。

另一个警告是,如果您的文本有超过num_cols列,您的匹配结果将合并它们,以便您最终每个匹配num_cols组。例如,如果teststr中有六列,但num_cols = 5:

teststr =  """aaa,bbb,111,22.3,2021-01-01 4:4:4.444,123
ccc,ddd,555,66.7,2021-02-02 8:8:8.888,456"""

上面的代码给出:

[('aaa,bbb', '111', '22.3', '2021-01-01 4:4:4.444', '123'),
('ccc,ddd', '555', '66.7', '2021-02-02 8:8:8.888', '456')]

你可以试试:

([^,]+),?

匹配任何不包含逗号后逗号的单词,次数不限

最新更新