我有包含各种交易的文本,我正在尝试使用正则表达式进行解析。
文字如下所示:
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)
您可以使用否定前瞻,如果您只需要描述,则可以在可选部分中使用第二个捕获组:
(\([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 组中的其余行
)?
关闭非捕获组并将其设为可选
正则表达式演示。