3. 提取现金流量表中的经营活动现金流净额
任务说明
从现金流量表中定位“经营活动产生的现金流量净额”行,提取其数值,并正确处理负值(如企业当期经营现金流为负)。输入为文本格式的现金流量表,输出为标准化后的数值(正数或负数)。
实现方案
使用Python正则表达式匹配关键行,提取金额字段。金额可能包含逗号千分位分隔符、括号表示负值(如(1,234))或直接负号(-1,234)。统一转换为浮点数,负值返回负数。
代码实现
import re
def extract_operating_cash_flow(text):
"""
从现金流量表文本中提取经营活动现金流净额。
支持格式:
- 经营活动产生的现金流量净额 1,234,567.89
- 经营活动产生的现金流量净额 -1,234,567.89
- 经营活动产生的现金流量净额 (1,234,567.89) # 括号表示负值
返回 float;未找到时返回 None。
"""
# 匹配行首或行中出现的指标名称,允许中间有空格
pattern = re.compile(
r'经营活动产生的现金流量净额\s*[::]?\s*' # 指标名
r'\(?\s*' # 可选的左括号
r'(-?[\d,]+(?:\.\d+)?)' # 金额主体(含负号)
r'\s*\)?' # 可选的右括号
)
match = pattern.search(text)
if not match:
return None
amount_str = match.group(1)
# 去除千分位逗号
amount_str = amount_str.replace(',', '')
value = float(amount_str)
# 若原文本中括号包裹且无负号,则视为负值
start = match.start()
if text[start:match.end()].count('(') > 0 and value > 0:
value = -value
return value
# 最小验证示例
if __name__ == "__main__":
# 正数情况
sample1 = """
一、经营活动产生的现金流量:
销售商品、提供劳务收到的现金 5,000,000.00
经营活动产生的现金流量净额 1,234,567.89
"""
print(extract_operating_cash_flow(sample1)) # 预期输出: 1234567.89
# 负数情况(直接负号)
sample2 = """
经营活动产生的现金流量净额 -987,654.32
"""
print(extract_operating_cash_flow(sample2)) # 预期输出: -987654.32
# 负数情况(括号表示)
sample3 = """
经营活动产生的现金流量净额 (456,789.01)
"""
print(extract_operating_cash_flow(sample3)) # 预期输出: -456789.01
# 未找到情况
sample4 = "投资活动产生的现金流量净额 100.00"
print(extract_operating_cash_flow(sample4)) # 预期输出: None
运行与验证
将上述代码保存为cash_flow_extractor.py,在命令行执行:
python cash_flow_extractor.py
程序会依次输出四个验证用例的结果。通过条件:前三个输出分别为1234567.89、-987654.32、-456789.01,第四个输出为None,即表示提取逻辑正确处理了正数、两种负值格式以及未匹配场景。
常见问题
- 指标名称变体:部分报表写作“经营活动产生的现金流量净额:”或含全角冒号,正则已兼容
[::]?。 - 金额带空格:若金额与指标名之间有多个空格,正则中的
\s*可匹配。 - 括号与负号同时出现:如
(-1,000),正则捕获-1,000,括号检测逻辑不会重复取反,结果正确为-1000.0。