【发布时间】:2020-09-18 21:10:35
【问题描述】:
我正在尝试编写一个 python 正则表达式,它从数据框中的几列中捕获多个值。下面的正则表达式尝试做同样的事情。字符串有 4 个部分。
group 1: Date - month and day
group 2: Date - month and day
group 3: description text before amount i.e. group 4
group 4: amount - this group is optional
第 3 组的一些特殊条件 - 文本 (1) 文本本身可能包含“-”、“$”等字符。所以我们不能使用 - & $ 作为文本的边界。 (2) 文本(第 3 组)有时后面可能没有数量。 (3) 第 3 组和第 4 组之间的空格是可选的
下面是python函数代码,它接收一个具有4列c1、c2、c3、c4的数据帧,在处理后将列dt、txt和amt添加到数据帧。
def parse_values(args):
re_1='(([JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC]{3}\s{0,}[\d]{1,2})\s{0,}){2}(.*[\s]|.*[^\$]|.*[^-]){1}([-+]?\$[\d|,]+(?:\.\d+)?)?'
srch=re.search(re_1, args[0])
if srch is None:
return args
m = re.match(re_1, args[0])
args['dt']=m.group(1)
args['txt']=m.group(3)
args['amt']=m.group(4)
if m.group(4) is None:
if pd.isnull(args['c3']):
args['amt']=args.c2
else:
args['amt']=args.c3
return args
为了测试结果,我有以下 6 行需要返回正确格式的 amt 列作为回报。
tt=[{'c1':'OCT 7 OCT 8 HURRY CURRY THORNHILL ','c2':'$16.84'},
{'c1':'OCT 7 OCT 8 HURRY CURRY THORNHILL','c2':'$16.84'},
{'c1':'MAR 15 MAR 16 LOBLAWS FOODS INC - EAST YORK -$80,00,7770.70'},
{'c1':'MAR 15 MAR 16 LOBLAWS FOODS INC - EAST YORK-$2070.70'},
{'c1':'MAR 15 MAR 16 LOBLAWS FOODS INC - EAST YORK$2070.70'},
{'c1':'MAR 15 MAR 16 LOBLAWS FOODS INC - EAST YORK $80,00,7770.70'}
]
t=pd.DataFrame(tt,columns=['c1','c2','c3','c4'])
t=t.apply(parse_values,1)
t
但是,由于 re_1 中的正则表达式错误,我无法正确解析 amt 列和 txt 列,因为它们返回 NaN 或遗漏了一些单词(如下面输出图像的某些行所示)。
【问题讨论】:
-
这可能不是解决方案,但我现在可能应该告诉你字符集 (
[]) 不能那样工作。它们匹配整个集合中的单个字符。[JAN]将匹配来自 JAN 的J, A, N,而(JAN)匹配整个 JAN 字符串
标签: python regex pandas dataframe