构造regexp表达式以检查特定的文本数据库格式

时间:2012-08-25 16:48:51

标签: python regex matlab

假设我有一个文本文件,它使用|符号来分隔数据库列,作为一个简单的数据库:

|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')

但不幸的是这个解决方案不是

  • 检查有多少|出现
  • 不保留返回值的字段顺序,因为忽略空字段
  • 告诉我哪个字段是空的

我从未构建过复杂的正则表达式规则并感谢您的意见!

2 个答案:

答案 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