2

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

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

但不幸的是,这个解决方案没有

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

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

4

2 回答 2

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]
于 2012-08-25T16:52:38.947 回答
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
于 2012-08-25T16:52:58.037 回答