Python re.findall正则无法匹配所有目标子串反而返回整段字符串问题
问题原因分析
- 原正则运算符优先级错误:
|优先级低于后续匹配规则,原表达式实际等价于匹配NASDAQ或者NYSE.*:.*\)$,导致单独的NASDAQ关键词会被直接提取,没有匹配后续完整内容 - 贪婪匹配问题:
.*会尽可能匹配最长的符合规则的内容,所以NYSE.*:.*\)$会直接匹配到整个字符串末尾的右括号,把多个括号的内容合并成一个结果 - 直接将原字符串转大写会丢失原本的大小写格式,无法得到和预期一致的大小写结果
修正后的代码
import re txt = "(NASDaq/abnjnxd:number1) ojsnxsjsxmjosx (nasDaq:number2) (NYSE:bhdnd) (Nasdaq:eres)" # 正则添加忽略大小写标志,用排除类匹配避免越界 x = re.findall(r"\(((?:NASDAQ|NYSE)[^:)]*:[^)]*)\)", txt, flags=re.IGNORECASE) print(x)
正则规则说明
\(匹配内容最外层的左括号- 外层捕获组内的内容就是我们要提取的目标,
re.findall会直接返回所有捕获组的匹配结果 (?:NASDAQ|NYSE)非捕获组,匹配开头的市场标识,加re.IGNORECASE后不区分大小写[^:)]*匹配冒号、右括号之外的任意字符,覆盖/abnjnxd这类可选后缀:匹配内容中的冒号分隔符[^)]*匹配右括号之外的任意字符,覆盖number1这类值内容\)匹配内容最外层的右括号
运行后输出:
['NASDaq/abnjnxd:number1', 'nasDaq:number2', 'NYSE:bhdnd', 'Nasdaq:eres']
内容的提问来源于stack exchange,提问作者drake1994
相关产品推荐
相关产品推荐

