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

时间:2019-01-24 16:57:23

标签: python regex

我有以下正则表达式(示例在Python中):

pattern = re.compile(r'^(([a-zA-Z0-9]*[a-zA-Z]+)([\d]+)|([\d]+))$')

这可以正确解析任何带有数字后缀和可选前缀(字母数字)的字符串:

a123
a2a123
123

所有人将正确地看到123作为后缀。它将正确拒绝错误的输入:

abc
123abc
()123  # Or other non-alphanumerics

不过,正则表达式本身相当笨拙,因此,多个捕获组通常是空的,这意味着我必须经历过滤掉它们的额外步骤。我想知道是否有比“一个数字或以一个字符结尾的字母数字开头的数字”更好的方式来考虑此正则表达式?

2 个答案:

答案 0 :(得分:2)

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

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]+)$')

答案 1 :(得分:2)

您可以使用

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

请参见regex demo

详细信息

  • ^-字符串的开头
  • [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))