2017-08-21 63 views
0

說我給123 *或1234 *模式,我想匹配以該模式開頭的任何10位數字。它應該有10位數字。正則表達式10位準確匹配特定模式

實施例:

圖樣:123應該匹配1234567890但不12345678

我試圖此正則表達式:(^(123)(\ d {0,10}))((1)\ d {10})..顯然這不起作用。我嘗試將模式和剩餘數字分組爲兩個不同的組。它匹配捕獲組後的10位數字(https://regex101.com/)。我如何檢查捕獲的組是10位數字?或者在這裏有什麼好的訣竅。請指導我。

+0

如果您不解釋真實生活場景,並提供您遇到問題的代碼,這很難實現。也許你需要['(?<!\ d)123 \ d {7}(?!\ d)'](https://regex101.com/r/rDv6Zy/2) –

+0

我試圖阻止電話號碼從某種模式開始。用戶設置像123 *或43 *等任何阻止模式。所以我需要阻止所有匹配該模式的入站和出站。但在掛斷之前,我需要知道呼叫失敗的原因是因爲他們撥打錯誤的數字或阻止模式來正確設置消息。這個正則表達式\ b(?= 123)\ d {10} \ b by @randomir似乎解決了這個問題。感謝您的幫助解決這個問題的想法。 – Anandan

回答

2

聽起來像是用於positive lookahead的情況下:

(?=123)\d{10} 

這將匹配的恰好10個數字的任何序列但前提是前綴爲123。測試它here

同樣的前綴1234

(?=1234)\d{10} 

當然,如果你知道前綴長度前期,你可以使用123\d{7},但隨後你必須改變與每個前綴的變化範圍限制(例如: 1234\d{6})。


此外,爲了確保只有10位數字孤立的羣體被捕獲,你可能想用(零長度)字邊界\b錨上述表達式:

\b(?=123)\d{10}\b 

,或者,如果您序列可以出現的裏面,你可能想使用\d負回顧後和預讀(由@Wiktor的意見建議):

(?<!\d)(?=123)\d{10}(?!\d) 
+0

'(?= 123)\ d {10}'='123 \ d {7}' –

+0

當然,但據我所知,OP要改變前綴,在這種情況下,使用lookahead更容易,因爲剩下的正則表達式不會改變。我已經添加了一個澄清。 – randomir

+1

是的,但並不能保證你只能匹配一個10位數的號碼,你可以在123456789中匹配1234567890。 –

1

我會保持它的簡單:

import re 

text = "1234567890" 

match = re.search("^123\d{7}$|^1111\d{6}$", text) 
if match: 
    print ("matched") 

只要將你的2個圖案本身和它應該是好去!需要注意的是123 *會趕上1234 *所以我使用1111 \ d {6}作爲一個例子