首页 文章

解析财务报表中的负数

提问于
浏览
2

我正在解析财务文件,目标是将一条线分成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 回答

  • 1

    你似乎对逃避括号感到很困惑 . 你的正则表达式有一些转义 * ,所以我真的不知道你在这里想做什么 .

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

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

    第一部分与您的尝试相同 . 然后重复两次这种模式:

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

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

    演示

  • 0

    以下模式适用于我:

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

    Output

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

相关问题