如何编写正则捕获x美元x美分格式字符串,解决Python匹配异常?
问题原因分析
- Python的
re.findall()方法存在特殊规则:当正则表达式中包含捕获分组时,返回结果只会是所有分组的匹配内容,而非整个正则匹配到的完整字符串。你目前输出的元组,就是正则里定义的多个捕获分组分别返回的结果。 - 你原有正则里写了多个不必要的捕获分组,包括
(s?)、(and )、(cent(s)?),这些分组你不需要单独提取的话,都会占用返回结果的位置,导致你拿不到完整的金额字符串。 - 补充一个小问题:定义正则时最好加
r前缀标记为原始字符串,避免Python解释器提前转义特殊字符,引发意料之外的匹配错误。
优化方案
方案1:仅提取完整的金额字符串
把所有非必要的捕获分组改为非捕获分组(分组开头加?:),同时简化数字匹配的写法:
正则表达式:r'\d+ (?:dollars?)(?:\s+and \d+ cents?)?'
优化后代码示例
import re # 更推荐用with语句管理文件,自动处理关闭逻辑 with open(r"C:\Users\inigo\PycharmProjects\pythonProject\all-OANC.txt", encoding='utf8') as train: strain = train.read() pattern2 = re.compile(r'\d+ (?:dollars?)(?:\s+and \d+ cents?)?') matches = pattern2.findall(strain) for match in matches: print(match)
输出结果就会是1 dollar、2 dollars and 71 cents这类完整的金额内容。
方案2:需要单独提取美元、美分数值
如果后续需要分别拿到美元数、美分数,只需要给对应部分加捕获分组即可:
正则表达式:r'(\d+) (?:dollars?)(?:\s+and (\d+) cents?)?'
对应代码示例
import re with open(r"C:\Users\inigo\PycharmProjects\pythonProject\all-OANC.txt", encoding='utf8') as train: strain = train.read() pattern2 = re.compile(r'(\d+) (?:dollars?)(?:\s+and (\d+) cents?)?') matches = pattern2.findall(strain) for dollar_cnt, cent_cnt in matches: # 没有美分的场景下,cent_cnt为空字符串,默认补0即可 cent_cnt = cent_cnt if cent_cnt else "0" print(f"美元金额:{dollar_cnt},美分金额:{cent_cnt}")
内容的提问来源于stack exchange,提问作者Inigo Hohmeyer
相关产品推荐
相关产品推荐

