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

如何在Python中提取字符串中的整数?isdigit()与split()能否联用?

问题

我希望提取字符串列表中每个字符串包含的数字,请问能否将isdigit()与split()结合实现该需求?是否有更简单高效的方法?

示例输入:

m = ['How to extract only number 122', 'The number 35 must be extracted', '1052 must be extracted']

预期输出:

numbers = [122, 35, 1052]
text = ['How to extract only number', 'The number must be extracted', 'must be extracted']

我的代码:

text = []
numbers = []
temp_numbers = []
for i in range(len(m)):
    text.append([word for word in m[i].split() if not word.isdigit()])
    temp_numbers.append([int(word) for word in m[i].split() if word.isdigit()])
for i in range(len(m)):
    text[i] = ' '.join(text[i])
for elem in temp_numbers:
    numbers.extend(elem)

print(text)
print(numbers)

回答

当然可以用isdigit()和split()结合实现需求,你的代码本身是可行的,但可以优化得更简洁高效——目前你的代码对每个字符串做了两次split(),可以改成一次遍历拆分后的单词,同时完成文本和数字的收集,减少不必要的计算。

优化后的代码(基于split()+isdigit()):

text = []
numbers = []

for s in m:
    words = s.split()
    filtered_text = []
    num = None
    for word in words:
        if word.isdigit():
            num = int(word)
        else:
            filtered_text.append(word)
    text.append(' '.join(filtered_text))
    numbers.append(num)

print(text)
print(numbers)

如果场景更复杂(比如数字和字母混合、数字带符号或小数),正则表达式会更灵活高效,比如用re.findall()提取数字,用re.sub()移除数字:

正则表达式实现:

import re

text = []
numbers = []

pattern = r'\b\d+\b'
for s in m:
    # 提取数字并转成整数
    nums = list(map(int, re.findall(pattern, s)))
    numbers.extend(nums)
    # 移除数字并清理多余空格
    cleaned_text = re.sub(pattern, '', s).strip()
    cleaned_text = re.sub(r'\s+', ' ', cleaned_text)
    text.append(cleaned_text)

print(text)
print(numbers)

说明:

  • 基于split()+isdigit()的方法适合数字是独立单词的场景,逻辑直观,不需要额外库。
  • 正则表达式方法适用性更广,能处理更多数字格式,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:39:37