You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则从DataFrame中提取i=后逗号分隔的所有数字?

解决DataFrame中提取i=后所有数字的问题

嘿,我来帮你搞定这个提取数字的需求!你之前的正则只能拿到第一个数字,是因为没考虑到逗号分隔的多个数字以及位数限制,咱们调整一下思路就能完美解决。

核心思路

你的目标是提取**i=之后、分号;之前**所有以逗号分隔的1-3位数字,我们可以用两种直观的方法实现:


方法一:分步提取(简单易懂,推荐)

这种方法把问题拆成三步,不用写复杂的正则,新手也能快速上手:

  1. 先提取每行开头的行号;
  2. 提取i=到第一个分号之间的数字字符串;
  3. 把字符串拆分成数字列表并转成整数。

代码示例

import pandas as pd

# 模拟你的DataFrame
df = pd.DataFrame({
    'content': [
        "18 cc9 =1 then do i=10;hcc(i)=0;end;",
        "19 cc15 =1 then do i=16,17,18,19;hcc(i)=0;end;",
        "20 cc20 =1 then do i=2,34,567;hcc(i)=0;end;"
    ]
})

# 1. 提取行号(每行开头的数字)
df['line_num'] = df['content'].str.extract(r'^(\d+)').astype(int)

# 2. 提取i=到分号之间的数字片段
df['num_str'] = df['content'].str.extract(r'(?<=i=)([^;]+)')

# 3. 拆分字符串为数字列表,转成整数
df['extracted_nums'] = df['num_str'].str.split(r',\s*').apply(lambda x: [int(num) for num in x])

# 输出你想要的格式
for _, row in df.iterrows():
    print(f"{row['line_num']} {row['extracted_nums']}")

输出结果

18 [10]
19 [16, 17, 18, 19]
20 [2, 34, 567]

方法二:正则直接匹配所有数字

如果你想用一行正则搞定,可以用str.findall配合更精准的正则表达式,确保只匹配i=之后的1-3位数字:

代码示例

df['extracted_nums'] = df['content'].str.findall(r'(?<=i=|\G,)\s*(\d{1,3})(?=[^;]*;)').apply(lambda x: [int(num) for num in x])

正则解释

  • (?<=i=|\G,):确保匹配的位置要么在i=之后,要么在上一个匹配的逗号之后(避免匹配其他地方的数字);
  • \s*:兼容逗号后面带空格的情况;
  • (\d{1,3}):精准匹配1-3位数字;
  • (?=[^;]*;):确保数字后面直到分号的内容,不会误匹配其他分号后的数字(比如hcc(i)里的数字)。

为什么你之前的正则不行?

你用的(?<=i=)([0-9]*)只能匹配i=后面的一段连续数字,遇到逗号就停了,而且没有限制1-3位的长度,所以拿不到所有数字。调整后的正则或分步方法都解决了这两个问题。

内容的提问来源于stack exchange,提问作者ALollz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:26:13