我正在解析财务文件,目标是将一行分成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) -
答案 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,]+
以匹配数字,然后是一个可选的右括号\)?
。