如何在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
相关产品推荐
相关产品推荐

