我正在嘗試創建一個正則運算式模式來匹配遵循某些規則的帳戶 ID。這種匹配將發生在使用 re 庫的 python 腳本中,但我相信這個問題主要只是一般問題的正則運算式。
帳戶 ID 遵循以下規則:
- 長度必須正好為 6 個字符
- 字母和數字不必是唯一的
和
- 3 個大寫字母后跟 3 個數字
或者
- 最多 6 個數字后跟一定數量的字母,使 id 的長度為 6
因此,以下將是“有效”帳戶 ID:
ABC123
123456
12345A
1234AB
123ABC
12ABCD
1ABCDE
AAA111
以下將是“無效”的帳戶 ID
ABCDEF
ABCDE1
ABCD12
AB1234
A12345
ABCDEFG
1234567
1
12
123
1234
12345
我可以非常簡單地匹配 3 個字母后跟 3 個數字,但是我無法理解如何撰寫一個正則運算式來不同地匹配一定數量的字母,例如如果 x = 字串中的數字數,則 y = 中的字母數字串 = 6 - x。
我懷疑使用前瞻可能有助于解決這個問題,但我對正則運算式仍然很陌生,并且對如何正確使用它們沒有驚人的了解。
我現在有以下正則運算式,它使用積極的前瞻來檢查字串是否以數字或字母開頭,并相應地應用不同的匹配規則:
((?=^[0-9])[0-9]{1,6}[A-Z]{0,5}$)|((?=^[A-Z])[A-Z]{3}[0-9]{3}$)
這可以匹配上面列出的“有效”帳戶 ID,但它也匹配以下應該無效的字串:
- 1
- 12
- 123
- 1234
- 12345
如果可能的話,如何根據字串開頭的數字來更改第一個捕獲組((?=^[0-9])[0-9]{1,6}[A-Z]{0,5}$)以知道要匹配多少個字母?
uj5u.com熱心網友回復:
我不確定如何修改您的正則運算式以確保整體用戶名長度為 6 個字符。但是,在 python 中檢查它會非常容易。
import re
def check_username(name):
if len(name) == 6:
if re.search("((?=^[0-9])[0-9]{1,6}[A-Z]{0,5}$)|((?=^[A-Z])[A-Z]{3}[0-9]{3}$)", name) != None:
return True
return False
希望這對您有幫助!
uj5u.com熱心網友回復:
您可以將模式撰寫為:
^(?=[A-Z\d]{6}$)(?:[A-Z]{3}\d{3}|\d [A-Z]*)$
解釋
^字串的開始(?=[A-Z\d]{6}$)正向前瞻,斷言 6 個字符 AZ 或數字直到字串結尾(?:替代品的非捕獲組[A-Z]{3}\d{3}匹配 3 個字符 AZ 和 3 個數字|或者\d [A-Z]*匹配 1 位數字和可選字符 AZ
)關閉非捕獲組$字串結束
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527107.html
