【发布时间】:2020-03-06 15:05:17
【问题描述】:
我正在尝试找到一个匹配字母和数字组合的正则表达式,每种类型必须至少出现一次。我发现这可以通过以下方式实现:
([a-z]+\d+|\d+[a-z]+)[a-z\d]*
但是,我希望整个字符串至少为 3 个字符,最多为 5 个字符。有没有办法做到这一点?
提前致谢!
【问题讨论】:
-
你能证明任何证据表明你试图自己解决这个问题吗?
我正在尝试找到一个匹配字母和数字组合的正则表达式,每种类型必须至少出现一次。我发现这可以通过以下方式实现:
([a-z]+\d+|\d+[a-z]+)[a-z\d]*
但是,我希望整个字符串至少为 3 个字符,最多为 5 个字符。有没有办法做到这一点?
提前致谢!
【问题讨论】:
我的猜测是,也许
^(?!.*[a-z]{2}|.*[0-9]{2})[a-z0-9]{3,5}$
或
^(?!.*(?:[a-z]{2}|[0-9]{2}))[a-z0-9]{3,5}$
可能需要,如果不允许使用两个连续的字母或数字。
如果我们想至少有一个字母和一个数字:
^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{3,5}$
可能是一种选择。
如果允许任何 3 到 5 次字母或数字:
^[a-z0-9]{3,5}$
可能工作正常。
import re
string = '''
aaa
aaa1
aaab1
a1
a1b2
a1b2c3
a1b2c3d4
'''
expression = r'^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{3,5}$'
print(re.findall(expression, string, re.M))
['aaa1', 'aaab1', 'a1b2']
如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在 this link 中观看它如何与一些示例输入匹配。
jex.im 可视化正则表达式:
【讨论】: