假设我有一个文本文件,它使用|
符号来分隔数据库列,作为一个简单的数据库:
|some text| 234| other field| bla| 1232|
我想构建一个
的正则表达式|
符号的出现次数)|
符号之间没有文字)这里有两个例子来说明我的想法:
line = |some text| 234| other field| bla| 1232|
output = my_regexp(line)
disp(output)
'some text', '234', 'other field', 'bla', '1232'
现在一样,但这次字段3是空的:
line2 = |some text| 234| | bla| 1232|
output = my_regexp(line)
disp(output)
'some text', '234', '', 'bla', '1232'
我尝试了以下
values = regexp(regexprep(line '[\s]', ''), '\|', 'split')
但不幸的是这个解决方案不是
|
出现我从未构建过复杂的正则表达式规则并感谢您的意见!
答案 0 :(得分:3)
这可以使用line.split
完成,如下所示:
values = [v.strip() for v in line.split("|")[1:-1]]
num_fields = len(values)
num_empty_fields = values.count("")
获取空字段的索引列表:
indices_empty_fields = [i for i, f in enumerate(values) if f == ""]
要使用正则表达式,请将values
的计算替换为:
import re
values = re.split("\s*\|\s*", line)[1:-1]
答案 1 :(得分:3)
我根本不会在这里使用正则表达式;对于这么简单的工作来说,它们太复杂了。
简单地拆分管道符号:
>>> '|some text| 234| other field| bla| 1232|'.split('|')
['', 'some text', ' 234', ' other field', ' bla', ' 1232', '']
丢弃第一个和最后一个值,删除其余值以删除空格,然后输入列:
>>> example = '|some text| 234| other field| bla| 1232|'
>>> columns = map(lambda s: s.strip(), example.split('|')[1:-1])
>>> columns
['some text', '234', 'other field', 'bla', '1232']
要对列进行计数而不进行拆分,只需使用.count()
函数,减去1:
>>> example.count('|') - 1
5
或获取列输出的len
:
>>> len(columns)
5
想要计算空列?拆分这些列并计算空列:
>>> columns.count('')
0
或者你的第二行:
>>> line2 = '|some text| 234| | bla| 1232|'
>>> columns_line2 = map(lambda s: s.strip(), line2.split('|')[1:-1])
>>> columns_line2
['some text', '234', '', 'bla', '1232']
>>> columns_line2.count('')
1