解析财务报表中的负数

时间:2018-12-07 17:19:37

标签: python regex python-3.x

我正在解析财务文件,目标是将一行分成3个部分。例如,我有以下行:

Telephone  9,000 9,000

以及当我使用此正则表达式命令时:

regex = r"([A-Za-z ]+)(?=\d|\S).*?([\d,]+)\s([\d,]+)"
re.findall(regex, <string>)

这是我得到的输出:

('Telephone ', '5,172', '1,771')

现在假设我在此财务报表中有负数(它们在财务文档中用括号表示):

string = Telephone  (9,000) (9,000)

如何通过考虑括号将其分为三类? 我尝试使用\(\*\)\*来解决零个或多个括号,但它返回None

regex = r"([A-Za-z ]+)(?=\d|\S).*?(\(\*[\d,]+\)\.)\s(\(\*[\d,]+\)\)"
re.findall(regex, string)

如何为这种情况更新正则表达式功能?

此外,如果字符串中有连字符,我该如何选择?

string = Telephone  (9,000) -

2 个答案:

答案 0 :(得分:1)

以下模式对我有用:

texts = ['Telephone  9,000 9,000',
         'Telephone  (9,000) (9,000)',
         'Telephone  (9,000) -'
         ]
for text in texts:
    print(re.findall("([\w+ ]+) (\(?[\d,-]+\)?) (\(?[\d,-]+\)?)", text))

输出

['Telephone', '9,000', '9,000']
['Telephone', '(9,000)', '(9,000)']
['Telephone', '(9,000)', '-']

答案 1 :(得分:0)

您似乎对转义括号感到困惑。您的正则表达式有一些转义的*,所以我真的不知道您在这里尝试做什么。

假设所有输入的格式正确(即没有丢失的括号或类似的东西),而您只想提取三个值,则可以使用此正则表达式:

([A-Za-z ]+)\s+(\(?[\d,]+\)?)\s+(\(?[\d,]+\)?)

第一部分与您的尝试相同。然后是此模式重复两次:

\s+(\(?[\d,]+\)?)

首先,我们首先匹配一些空白\s+,然后捕获组开始。在捕获组中,我们首先查看是否有括号\(??是在这里使用的量词,因为我们允许使用0或1括号。然后是一个简单的字符类[\d,]+以匹配数字,然后是一个可选的右括号\)?

Demo