我正在解析财务文件,目标是将一条线分成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 回答
你似乎对逃避括号感到很困惑 . 你的正则表达式有一些转义
*
,所以我真的不知道你在这里想做什么 .假设所有输入都是格式良好的(即没有丢失括号或类似的东西)并且您只想提取三个值,您可以使用此正则表达式:
第一部分与您的尝试相同 . 然后重复两次这种模式:
在开始时,我们首先匹配一些空白
\s+
,然后捕获组开始 . 在捕获组中,我们首先看看是否有任何括号\(?
.?
是这里使用的量词,因为我们允许0或1括号 . 然后是一个简单的字符类[\d,]+
来匹配数字,然后是一个可选的右括号\)?
.演示
以下模式适用于我:
Output