如何在Python正则表达式中传递重复次数参数?
解决正则函数匹配指定长度单词返回空的问题
嘿,这个问题我之前也踩过坑!你写的函数里,正则字符串里的{n}并没有被替换成你传入的参数值——因为Python带r前缀的原始字符串不会自动把变量插入进去,所以正则引擎其实在尝试匹配字面量的{n},自然找不到符合要求的单词。
问题根源
你的原始代码里:
return re.findall(r"\b[a-zA-z]{n}\b", text)
这里的{n}就是字符串里的普通字符,正则引擎不会把它当成变量n的值来解析。顺便提一句:[a-zA-z]这个范围其实有问题,A-z会包含[、\这类非字母字符,应该写成[a-zA-Z]来严格匹配大小写字母。
正确的解决方案
这里有几种靠谱的写法:
1. 使用f-string格式化(Python 3.6+推荐)
用f-string动态生成正则表达式,注意要把量词里的{}转义(用{{}}),这样最终会生成正确的{5}格式:
import re def findwords(text, n): return re.findall(rf"\b[a-zA-Z]{{{n}}}\b", text)
2. 使用str.format()方法(兼容旧版本Python)
如果需要支持Python 3.5及更早版本,用format方法也可以:
import re def findwords(text, n): pattern = r"\b[a-zA-Z]{{{0}}}\b".format(n) return re.findall(pattern, text)
3. 字符串拼接(不推荐,但可以用)
虽然能工作,但字符串拼接容易出错,尤其是当参数类型复杂时,需要手动转成字符串:
import re def findwords(text, n): pattern = r"\b[a-zA-Z]{" + str(n) + r"}\b" return re.findall(pattern, text)
测试一下
调用修正后的函数:
print(findwords('The quick brown fox jumps over the lazy dog.', 5))
会返回预期的结果:['quick', 'brown', 'jumps']
内容的提问来源于stack exchange,提问作者cDub
相关产品推荐
相关产品推荐

