我是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')]
你可以试试:
([^,]+),?
匹配任何不包含逗号后逗号的单词,次数不限