2017-04-20 48 views
0

我想正則表達式匹配的電話號碼,我想出了下面的代碼:Python的正則表達式給出假陰性

pattern = re.compile("^(1?[2-9]\d{2}([.\-\s])?\d{3}\2\d{4}){1}$") 
if pattern.match(phoneNumber): 
    return True 

這應該與數字,如:
1214-444-4444
214.333.3333

但是,這不符合上述任何例子。我已經在幾個不同的正則表達式驗證器上進行了測試,並且它們都是成功的。我假設Python正則表達式引擎是不同的,但經過四處搜索我找不到差異。有什麼建議麼?

+0

https://regex101.com/r/QVqpFn/1不能在regex101上工作 –

+2

**總是**使用[原始字符串](https://docs.python.org/3/reference/lexical_analysis。 html#字符串和字節文字)的Python正則表達式。在這種情況下,'\ 2'插入代碼點'\ x02',而不是反斜槓和2(它必須是反斜槓,2代表''re'才能看到正在嘗試使用的正則表達式轉義符)。當下一個字符不是字符串轉義的時候,Python不需要反斜槓就可以「逃脫」,但它會讓你'\ 2'(和'\ b','\ a','\ f'等)。在文字之前加一個'r'使它變成raw:'r'^(...' – ShadowRanger

+0

奇怪的是,它可以在http://www.regexpal.com/ – CuriousGeorge

回答

0

按照你的代碼,做一些小小的改動:

import re as re 
def test(s): 
    pattern = re.compile("^1?[2-9]\d{2}([.\-\s])?\d{3}\\1?\d{4}$") 
    return pattern.match(s) is not None 

print(test("12142142141")) #True 
print(test("1214-444-4444")) #True  
print(test("214.333.3333")) #True 
print(test("214-333-3333")) #True 
print(test("214.333-3333")) #False 

所有三個測試用例通過。

+0

我認爲模式的邏輯是錯誤的,例如紐約韋斯切斯特有一個區號爲914的區號,第二個數字爲1 –

+0

但是,我希望在整個電話號碼中使用相同的分隔符,所以如果用戶使用 - 作爲第一個分隔符,我只想要接受破折號,這就是爲什麼我使用\ 2以指示組2:214-214-2141的作品,但214.214-2141不是 – CuriousGeorge

+0

@CuriousGeorge,有點改變,見上文。 –

0

試試這個正則表達式:

^1?(?:(?:\d{10})|(?:\d{3}-\d{3}-\d{4})|(?:\d{3}\.\d{3}\.\d{4}))$ 

最有可能你不希望允許混合分離器的類型,例如如果一個數字不使用分隔符,那麼它在任何地方都不能使用分隔符(並且對於點和連字符也是一樣的)。在這種情況下,我們可以使用交替來覆蓋三種類型的模式。

演示在這裏:

Regex101

+0

這個工作!工作在Pythex.org以及我的代碼中。感激 – CuriousGeorge

+0

需要同一種分離的是OP的(編碼錯誤)使用反向引用的點。 –

+0

@TimPeters我知道這一點,我可能不會使用反向引用 –