使用正则表达式解析具有特定字符的字符串(如果存在)

问题描述 投票:0回答:1

我有包含各种交易的文本,我正在尝试使用正则表达式进行解析。

文字如下所示:

JT Meta Platforms, Inc. - Class A
Common Stock (META) [ST]S (partial) 02/08/2024 03/05/2024 $1,001 - $15,000
F S: New
S O: Morgan Stanley - Select UMA Account # 1
JT Microsoft Corporation - Common
Stock (MSFT) [ST]S (partial) 02/08/2024 03/05/2024 $1,001 - $15,000
F S: New
S O: Morgan Stanley - Select UMA Account # 1
JT Microsoft Corporation - Common
Stock (MSFT) [OP]P 02/13/2024 03/05/2024 $500,001 -
$1,000,000
F S: New
S O: Morgan Stanley - Portfolio Management Active Assets Account
D: Call options; Strike price $170; Expires 01/17 /2025
C: Ref: 044Q34N6

我创建了一个正则表达式来解析单个交易,由代码(例如,(MSFT))、类型(例如,[ST]、[OP])和金额(例如,$500,000 等)的组合表示,如下所示:

transactions = rx.findall(r"\([A-Z][^$]*\$[^$]*\$[,\d]+", text)

交易以列表形式返回,例如如下所示:

(META)  [ST]S (partial) 02/08/2024 03/05/2024 $1,001 - $15,000

我想添加逻辑以包含描述详细信息(即“D:...”)(如果存在)。我尝试使用下面的模式,但它最终只返回一个大交易,因为前两个交易没有描述详细信息(即“D:”)。

我想看这个:

(META)  [ST]S (partial) 02/08/2024 03/05/2024 $1,001 - $15,000

..

(MSFT)  [ST]S (partial) 02/08/2024 03/05/2024 $1,001 - $15,000

..

(MSFT) [OP]P 02/13/2024 03/05/2024 $500,001 -
$1,000,000
F S: New
S O: Morgan Stanley - Portfolio Management Active Assets Account
D: Call options; Strike price $170; Expires 01/17 /2025

我做错了什么?

rx.findall(r"\([A-Z][^$]*\$[^$]*\$[,\d]+[\s\S]*?D:(.*)", text)
python regex
1个回答
0
投票

您可以使用否定前瞻,如果您只需要描述,则可以在可选部分中使用第二个捕获组:

(\([A-Z]+\)[^$]*\$[^$]*\$[,\d]+)(?:(?:\n(?!.*\([A-Z]+\)[^$]*\$[^$]*\$[,\d]|D:).*)*\n(D:.*))?

模式匹配:

  • (
    捕获第 1 组
    • \([A-Z]+\)
      匹配
      (
      1 个以上字符 A-Z,然后
      )
    • [^$]*\$[^$]*\$[,\d]+
      匹配除
      $
      之外的任何字符,然后匹配
      $
      ,然后再次匹配除
      $
      之外的任何字符,然后
      $
      后跟 1+ 次
      ,
      或数字
  • )
    关闭第 1 组
  • (?:
    非捕获组
    • (?:
      非捕获组
      • \n
        匹配换行符
      • (?!.*\([A-Z]+\)[^$]*\$[^$]*\$[,\d]|D:)
        负向前瞻,断言右侧不是初始模式或者该行以
        D:
      • 开头
      • .*
        匹配整行
    • )*
      关闭非捕获组并可选择重复
    • \n(D:.*)
      匹配换行符,然后捕获
      D:
      以及第 2 组中的其余行
  • )?
     关闭非捕获组并将其设为可选
查看

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.