Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析财务报表中的负数_Python_Regex_Python 3.x - Fatal编程技术网

Python 解析财务报表中的负数

Python 解析财务报表中的负数,python,regex,python-3.x,Python,Regex,Python 3.x,我正在解析财务文档,目标是将一行分解为3个组件。例如,我有以下行: Telephone 9,000 9,000 当我使用这个regex命令时: regex = r"([A-Za-z ]+)(?=\d|\S).*?([\d,]+)\s([\d,]+)" re.findall(regex, <string>) 现在假设本财务报表中有负数(在财务文件中用括号表示): string = Telephone (9,000) (9,000) 如何通过计算括号将其分为三组? 我曾尝试使用

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

Telephone  9,000 9,000
当我使用这个regex命令时:

regex = r"([A-Za-z ]+)(?=\d|\S).*?([\d,]+)\s([\d,]+)"
re.findall(regex, <string>)
现在假设本财务报表中有负数(在财务文件中用括号表示):

string = Telephone  (9,000) (9,000)
如何通过计算括号将其分为三组? 我曾尝试使用
\(\*
\)\*
来解释零个或多个括号,但它返回

regex = r"([A-Za-z ]+)(?=\d|\S).*?(\(\*[\d,]+\)\.)\s(\(\*[\d,]+\)\)"
re.findall(regex, string)
我如何更新我的正则表达式函数来解释这种情况

另外,如果字符串有连字符,如何提取

string = Telephone  (9,000) -

以下模式适合我:

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

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

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

([A-Za-z ]+)\s+(\(?[\d,]+\)?)\s+(\(?[\d,]+\)?)
第一部分与您的尝试相同。然后这个模式重复两次:

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

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