如何编写正则表达式以从财务报告中提取垂直打印的月份

时间:2014-11-14 17:54:02

标签: regex

我有很多基于文本的财务报告,我最终想要转换为CSV文件。该文件包含三列,其中三个字母的月份缩写垂直打印。垂直月份(JAN FEB,......)合谋破坏财务报告的流程,我想在第一轮流程中将其从文件中删除,最终旨在提取财务数据。我已经包含了我在下面描述的图像:

enter image description here

编辑:我知道这几个月总是在大写字母中。

如您所见,Sales行在第三行的DEC中运行到C.几行下来你可以看到毛利率在11月的第二和第三个N之间。所以问题是如何编写一些正则表达式,从文档中删除日期,然后提取我的财务数据。

编辑2:这是一个更多文件的粘贴:

D                             D                             D
E                             E                             E
C                             C   Sales $123,000C

Cost of Goods Sold $120,000


N                             NGross Margin $3,000N
O                             O                             O
V                             V      20-          OperatingV




O                             O                             O
C                             C       30,000       TravelC
T                             T                             T




S                             S       120          UtilitiesS
E                             E                             E
P                             P                             P


10,000 Membership
A                             A                             A
U                             U                             U
G                             G      1,9000              RentG


26          Postage

J                             J                             J
L                             L                             L
Y                             Y                             Y
2,400            Tooling


J                             J                             J
U                             U                             U
N    -22,000             Taxes                             NPretax Income

任何建议或帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

这是使用您提供的测试数据查找所有违规字母的模式。

((^[A-Z])(?=\s))|((?<=\d)[A-Z])|([A-Z](?=\s))|((?<=[a-z])[A-Z])|([A-Z](?=[A-Z]))


修改

由于评论,又增加了一个组

说明:
第1组:((^[A-Z])(?=\s))
细分:在行的开头查找大写字母,后面跟着空格

第2组:((?<=\d)[A-Z])
细分:查找以数字

开头的大写字母

第3组:([A-Z](?=\s))
细分:查找大写字母后跟空格

第4组:((?<=[a-z])[A-Z])
细分:查找以小写字母开头的大写字母

第5组:([A-Z](?=[A-Z]))
细分:在其后面直接查找带大写字母的大写字母

答案 1 :(得分:1)

搜索^([ABCDEFGJLMNOPRSTUVY])\s+\1\s*([-a-zA-Z\d, $]+)\1$并替换\2会让您关闭。

在TextWrangler 4.5.11上测试

略微调整以适应RegEx101

^&+添加到第二个拼出的类似乎修复了@Mutuelinvestor Rubular。 (之前没有关心它,因为逐字测试数据中缺少它。)

因此:^([ABCDEFGJLMNOPRSTUVY])\s+\1\s*([-a-zA-Z\d, $^&+]+)\1$将被搜索。

然而,它仍然没有处理最后一行,初始资本只重复一次。

击穿:
^线锚的开始 ([ABCDEFGJLMNOPRSTUVY])从几个月内抓取一封大写字母&#39;三个字母的缩写 - 以两个后来的重复为目标 \s+至少有一个空格字符
在行首开始捕获的\1反向引用字母 \s*任意数量的空白字符(包括无) ([-a-zA-Z\d, $^&+]+)捕获在明显有效载荷中观察到的任何字符 - 用于替换为\ 2
\1对行上第一个字符的另一个反向引用
$行尾锚