为了账号安全,请及时绑定邮箱和手机立即绑定

如何对数字后缀进行正则表达式?

如何对数字后缀进行正则表达式?

慕森王 2021-10-19 16:59:34
我有以下正则表达式(示例在 Python 中):pattern = re.compile(r'^(([a-zA-Z0-9]*[a-zA-Z]+)([\d]+)|([\d]+))$')这可以正确解析任何具有数字后缀和可选的字母数字前缀的字符串:a123a2a123123All 将正确地123视为后缀。它将正确拒绝错误的输入:abc123abc()123  # Or other non-alphanumerics不过,正则表达式本身相当笨拙,因此,一些捕获组通常是空的,这意味着我必须执行额外的步骤来过滤掉它们。我很好奇是否有比“数字或以字符结尾的字母数字开头的数字”更好的方式来考虑这个正则表达式?
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您可以使用

^[A-Za-z0-9]*?([0-9]+)$

查看正则表达式演示

细节

  • ^ - 字符串的开始

  • [A-Za-z0-9]*?- 任何字母/数字,零次或多次,尽可能少(由于这种非贪婪匹配,下一个模式([0-9]+),将匹配字符串末尾的所有数字)

  • ([0-9]+) - 第 1 组:一位或多位数字

  • $ - 字符串的结尾。

在 Python 中:

m = re.search(r'^[A-Za-z0-9]*?([0-9]+)$') # Or, see below

# m = re.match(r'[A-Za-z0-9]*?([0-9]+)$') # re.match only searches at the start of the string

# m = re.fullmatch(r'[A-Za-z0-9]*?([0-9]+)') # Only in Python 3.x 

if m:

    print(m.group(1))


查看完整回答
反对 回复 2021-10-19
?
慕标5832272

TA贡献1966条经验 获得超4个赞

如果您使用非捕获组并正确管理重复,问题就会自行缓解。

pattern = re.compile(r'^(?:[a-zA-Z0-9]*[a-zA-Z]+)?([0-9]+)$')

后缀只有一个捕获组(组 1),并且没有捕获它之前的字母数字。

或者,使用命名组是另一种选择,它通常使长的、结构化的正则表达式更容易维护:

pattern = re.compile(r'^(?P<a>[a-zA-Z0-9]*[a-zA-Z]+)?(?P<suffix>[0-9]+)$')


查看完整回答
反对 回复 2021-10-19
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信