我有以下正则表达式(示例在 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))
慕标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]+)$')
添加回答
举报
0/150
提交
取消