You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:33:24