我正在努力提高我在 python 中的正則運算式技能,但我遇到了一個有趣的問題。假設我正在嘗試匹配有效的信用卡號碼,并且要求是它有 4 個或更多連續數字。1234-5678-9101-1213 沒問題,但 1233-3345-6789-1011 不行。我目前有一個正則運算式,當我沒有破折號時可以使用,但我希望它在兩種情況下都可以使用,或者至少在某種程度上我可以使用|它來匹配任何一種情況。到目前為止,這是我對連續數字的了解:
validNoConsecutive = re.compile(r'(?!([0-9])\1{4,})')
我知道我可以做一些替代的'-'有'',但在努力使我的代碼更靈活,這將是只是一個正則運算式更容易。這是更多背景關系的功能:
def isValid(number):
validStart = re.compile(r'^[456]') # Starts with 4, 5, or 6
validLength = re.compile(r'^[0-9]{16}$|^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}$') # is 16 digits long
validOnlyDigits = re.compile(r'^[0-9-]*$') # only digits or dashes
validNoConsecutive = re.compile(r'(?!([0-9])\1{4,})') # no consecutives over 3
validators = [validStart, validLength, validOnlyDigits, validNoConsecutive]
return all([val.search(number) for val in validators])
list(map(print, ['Valid' if isValid(num) else 'Invalid' for num in arr]))
我研究了排除字符和前瞻/后視方法,但我似乎無法弄清楚。是否有某種方法可以忽略給定正則運算式的字符?謝謝您的幫助!
uj5u.com熱心網友回復:
您可以(?!.*(\d)(?:-*\1){3})在^(字串開頭)之后添加負前瞻以添加限制。
該^(?!.*(\d)(?:-*\1){3})模式匹配
^- 字串的開始(?!.*(\d)(?:-*\1){3})- 如果在當前位置的右側,則匹配失敗的負前瞻.*- 盡可能多的除換行符以外的零個或多個字符(\d)- 第 1 組:一位數(?:-*\1){3}- 三個零個或多個-字符后跟在第 1 組中捕獲的相同數字(作為\1對第 1 組值的行內反向參考)。
請參閱正則運算式演示。
如果您想將此模式與其他模式結合起來,只需將前瞻放在后面^(如果您之前有其他模式和捕獲組,則需要調整\1反向參考)。例如,將它與你的第二個正則運算式結合起來validLength = re.compile(r'^[0-9]{16}$|^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4}$'),它看起來像
validLength = re.compile(r'^(?!.*(\d)(?:-*\1){3})(?:[0-9]{16}|[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{4})$')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336638.html
標籤:Python 正则表达式 regex-lookarounds
上一篇:替換可變數量的組
