解析财务报表中的负数

2024-05-13 03:05:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Telephone  9,000 9,000

当我使用这个regex命令时:

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)

如何更新regex函数来解释这种情况?你知道吗

另外,如果字符串有一个连字符,我该如何选取它?你知道吗

string = Telephone  (9,000) -

Tags: 文件文档命令re目标stringregex括号
2条回答

以下模式适合我:

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

你好像对逃逸很困惑。你的正则表达式有一些转义的*,所以我真的不知道你想在这里做什么。你知道吗

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

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

第一部分和你的尝试是一样的。然后这个模式重复两次:

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

首先,我们匹配一些空格\s+,然后开始捕获组。在capture组中,我们首先查看是否有任何括号\(??是这里要使用的量词,因为我们允许使用0或1括号。然后是一个直接的字符类[\d,]+来匹配数字,后面是一个可选的右括号\)?。你知道吗

Demo

相关问题 更多 >