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

Python 构造regexp表达式以检查特定的文本数据库格式,python,regex,matlab,Python,Regex,Matlab,假设我有一个文本文件,它通过使用|符号来分隔数据库列,充当一个简单的数据库: |some text| 234| other field| bla| 1232| 我想构造一个将 检查每行中有多少字段(通过计算|符号的出现次数) 检查哪些字段为空(两个|符号之间没有文本) 将返回每个字段的值 将从字段值周围去除空白。但要小心,空旷的田野不应该被剥去 这里有两个例子来说明我想要什么: line = |some text| 234| other field| bla| 1232| output =

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

|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')
但不幸的是,这一解决方案并不适用

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

我从未建立过复杂的regexp规则,非常感谢您的输入

这可以使用
行来完成。拆分如下:

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 == ""]
要使用正则表达式,请将
值的计算替换为:

import re
values = re.split("\s*\|\s*", line)[1:-1]

我不会在这里使用正则表达式;对于这么简单的工作来说,它们太复杂了

仅在管道符号上拆分:

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

你为什么给这条蟒蛇贴标签?示例代码行似乎是Matlab-您想要Python解决方案吗?@DavidRobinson我不在乎它是Matlab还是Python解决方案。我都很感激。希望没问题@戴维德罗宾森是的,伙计,现在你把我弄糊涂了。我喜欢你的解决方案,但现在你又使用了regexp:)@MartijnPieters:我的主要意思是,你不需要使用regex来计算字段数或空字段数,但你是对的!Edited@DavidRobinson通过访问
,有没有一种简单的方法来找出哪个字段是空的?@memyself:当你说“哪个字段是空的”:你是指一个空字段的索引列表?@memyself:当然,我把它加回去了,但两种方法之间确实没有太大区别(在某种客观意义上足以判断一个比另一个好)。