2016-04-10 28 views
0

我剛剛在我的Python類中學習過正則表達式,我需要幫助理解正則表達式中的一段代碼。該代碼是一種常見的信用卡搜索的問題:Visa信用卡正則表達式:分組聲明

\b4[0-9]{12}(?:[0-9]{3})\b 

我只是想知道最後的部分是指:

(?:[0-9]{3})\b 

我從它的分組斷言另一個源讀取,但任何人都可以請解釋這對我來說更清楚嗎?

此外,\ b在最後表示什麼意思?

非常感謝你

+0

在這種情況下,'(?:)'完全沒有貢獻,可以省略(但不是它們之間的東西!)。 – Kevin

+0

\ b代表'邊界'或'邊界'。它匹配單詞的開頭或結尾。我發現它非常有用,但確保您理解您使用的系統中的字符是否屬於單詞的一部分可能會非常棘手。 (例如,短劃線是什麼?下劃線?)。 –

回答

0

您使用圓括號來標識匹配中的組。

?:標誌着一個非捕獲組

>>> s = '4123412341234123' 
>>> print (re.match(r"\b4[0-9]{12}(?:[0-9]{3})\b", s).groups()) 
() 
>>> print (re.match(r"\b4[0-9]{12}([0-9]{3})\b", s).groups()) 
('123',) 

\b字邊界字符匹配

+0

謝謝。打印示例使其更加清晰 – gosok

1

它被稱爲非捕獲組。這意味着隨後的?:是可選的,因爲VISA卡長度在16到13位之間,取決於它是新卡還是長卡。這增加了3個可選的數字,可以包含或不包含在搜索中。

至於\ b在最後,你可以把它看作是一個完整的單詞在報價中搜索。

檢查這個網站了解更多信息: http://www.regular-expressions.info/creditcard.html

乾杯!

0

(?:)表示non-capturing基。這意味着不要捕獲下面的匹配。如果您使用的是()(而不是(?:)),它會捕獲變量中匹配的任何內容,並且可以稍後用作$1\1,無論您的語言支持哪種語言。如果您使用(?:),則匹配不會存儲在任何變量中。

\b表示字邊界。它是一個單詞字符和非單詞字符之間的一個位置。

(?: #Non-capturing group (Do not store it in a variable) 
    [0-9] #Match any digit between 0 to 9 
    {3} #Do this three times (i.e Match any digit between 0 to 9 three times) 
) 
\b #Word boundary