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。