我有以下正則表達式(示例在 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
提交
取消