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