Python正则如何匹配仅含字母数字且至少含一个问号的字符串
需求说明
编写正则表达式匹配符合以下规则的字符串:
- 字符串只能由英文字母(大小写)、数字、问号组成
- 字符串中必须包含至少1个问号
- 需匹配的合法样例:
ABC123?A、1AB?CA?、?2ABCD、???、123? - 需排除的非法样例:
ABC123:无问号ABC.?1D1:包含非法字符.ABC(a)?1d:包含非法字符(、)
之前使用的正则^[A-Za-z0-9?]+$只能校验字符范围,无法强制要求至少存在1个问号;在MySQL中临时用两层嵌套正则过滤实现了需求,代码如下:
select * from ( select * from norm_prod.skill_patterns where pattern REGEXP '^[A-Za-z0-9?]+$') AS XXX where XXX.pattern not REGEXP '^[A-Za-z0-9]+$'
需要可直接实现该逻辑的单条正则写法。
单条正则实现
通用写法(支持Python、MySQL 8.0+等支持正向预查的正则引擎)
^(?=.*\?)[A-Za-z0-9?]+$
规则拆解
^、$:分别匹配字符串的开头和结尾,确保整串符合规则,不会出现部分匹配的情况(?=.*\?):正向肯定预查,不消耗匹配字符,仅校验字符串中任意位置至少存在1个问号[A-Za-z0-9?]+:匹配1个及以上的大小写字母、数字、问号,限定合法字符范围
兼容写法(支持低版本MySQL等不支持预查的正则引擎)
如果使用的正则引擎不支持预查语法,可以用顺序匹配的写法实现相同逻辑:
^[A-Za-z0-9]*\?[A-Za-z0-9?]*$
规则拆解
- 先匹配0个或多个字母/数字
- 强制匹配1个问号,保证字符串中至少存在1个问号
- 问号后可以匹配0个或多个字母/数字/问号,覆盖问号出现在字符串任意位置的场景
- 开头结尾加
^、$保证整串匹配,不会混入非法字符
内容的提问来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

