如何用Python提取含数值(含拼写数字)及前后各一个单词的文本
解决Python提取含数值的文本片段问题
嘿,我来帮你搞定这个提取包含数值的文本片段需求!要实现你想要的效果,关键是写一个精准的正则表达式,既能匹配阿拉伯数字(包括带千分位逗号的)和拼写形式的数字,又能捕获数值前后的第一个单词。
解决方案代码
import re text = "I have 2 brothers and they bought one car each. My oldest brother invested 1,000 dollars." # 定义正则表达式:匹配「前单词 + 数值(阿拉伯或拼写) + 后单词」的结构 pattern = r'(\w+) (\b(?:\d{1,3}(?:,\d{3})*|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)\b) (\w+)' # 提取所有匹配的三元组,再拼接成目标字符串格式 matches = re.findall(pattern, text) result = [f'{prev} {num} {next_word}' for prev, num, next_word in matches] print(result) # 输出:['have 2 brothers', 'bought one car', 'invested 1,000 dollars']
代码细节解释
- 正则表达式拆分:
(\w+):捕获数值前面的第一个完整英文单词(匹配字母、数字、下划线,完全覆盖普通英文单词场景)\b:单词边界标记,确保匹配的数字是独立的(比如不会把"one"误判成"someone"的一部分)(?:\d{1,3}(?:,\d{3})*):匹配带千分位逗号的阿拉伯数字,支持2、1,000、123,456这类格式|one|two|...|twelve:匹配拼写形式的数字,你可以根据需求扩展更多(比如thirteen、fourteen等)- 最后一个
(\w+):捕获数值后面的第一个完整英文单词
re.findall会返回所有符合规则的三元组列表,再通过列表推导式把每组拼接成你需要的字符串格式。
场景扩展建议
如果要处理更复杂的文本场景,可以微调正则:
- 若数值前后可能带有标点:可以把
(\w+)改成(\w+|[^\w\s])?,后续再过滤空值即可 - 若要支持更多拼写数字:可以先定义一个数字单词列表,动态生成正则片段,比如:
number_words = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen'] num_word_pattern = '|'.join(number_words) pattern = rf'(\w+) (\b(?:\d{1,3}(?:,\d{3})*|{num_word_pattern})\b) (\w+)'
内容的提问来源于stack exchange,提问作者dc4teg
相关产品推荐
相关产品推荐

