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

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


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

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


a123

a2a123

123

All 将正确地123视为后缀。它将正确拒绝错误的输入:


abc

123abc

()123  # Or other non-alphanumerics

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


慕森王
浏览 189回答 2
2回答

一只萌萌小番薯

您可以使用^[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))

慕标5832272

如果您使用非捕获组并正确管理重复,问题就会自行缓解。pattern&nbsp;=&nbsp;re.compile(r'^(?:[a-zA-Z0-9]*[a-zA-Z]+)?([0-9]+)$')后缀只有一个捕获组(组 1),并且没有捕获它之前的字母数字。或者,使用命名组是另一种选择,它通常使长的、结构化的正则表达式更容易维护:pattern&nbsp;=&nbsp;re.compile(r'^(?P<a>[a-zA-Z0-9]*[a-zA-Z]+)?(?P<suffix>[0-9]+)$')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python