2016-05-16 140 views
1

我用Python寫這個正則表達式,並測試了它的regex101,但它仍然沒有工作的方式,我想:Python的正則表達式來找到符號數字符號

((^[-\/\\\(\)\s\,\&\.]+)?([0-9]+)([-\/\\\(\)\s\,\&\.])+) 

我想找到的是模式其中串選擇性地啓動,或與這些符號中的一個端部,並具有在中間ONLY位數:

-/\()& . 

此列表包括短劃線,斜槓,背部斜線,括號,連字符,空格,和週期。如果字符串包含ONLY數字,並且在字符串的開頭和/或結尾處帶有可選的標點符號,則搜索應該返回true。

這個正則表達式似乎適用於大多數情況下,但如果我在中間的數字中添加一個字母失敗。它仍然最終返回True。我該怎麼做這個正則表達式,以便它只在符號(可選),所有數字,符號(可選)的情況下才返回true?

案例,它應該返回True:

  1. 符號+數字即(9672
  2. 只有數字,即20427304或8
  3. 數字+符號即345--
  4. 符號+數字+符號即(67-。

不應該返回True的情況(因爲字符串中的'y'):

(678983y733)..

+0

您肯定會在格式 –

回答

2

您的正則表達式中有幾件事需要改變。

  • 首先,你有太多的逃避去那裏,這使得閱讀非常混亂。

  • 其次,你有奇怪的東西與圓括號發生。你不需要任何東西來完全包圍正則表達式,因爲$0已經會返回。

  • 您的最後一個字符類在您的正則表達式中不是可選的。

  • 您需要用^$包圍所有內容以確保字符串不是部分匹配。

這就是我想出了:

^([-/\\()\s,&.]*)([0-9]+)([-/\\()\s,&.]*)$ 

注意,具有([something]+)?等於([something]*),但後者更具可讀性。

+0

結尾錯過'$'或'\ Z'謝謝。我不知道'] +)?和'] *)'是等價的。 –

+0

@ChrisNielsen:他們可能在這種特殊情況下,但總的來說他們當然不是。 – Jan

1

我認爲你要找的是re.fullmatch

import re 
ponct = '[' + re.escape('-/\()&') + ']*' 
p = re.compile(ponct + '[0-9]+' + ponct) 

然後p.fullmatch('(678983y733)')將返回None, 和所有其他的例子將返回匹配。

+0

當我嘗試運行代碼示例時,出現此錯誤: 'AttributeError:'_sre.SRE_Pattern'對象沒有'fullmatch''的屬性 –

+0

您必須有一個Python版本<'3.4',就是這樣。但是爲了清晰起見,'re.escape'函數仍然有些用處。 – Jacquot

+0

啊,好的。謝謝。我使用2.7。 –

0

這可以讓你找到他們嵌入在一個字符串,而不僅僅是在開始。這個?允許零個或一個符號。如果您想要零個或多個前導/尾隨符號,請將其更改爲*。

([-\\\/\&\.]?)\b([0-9]+)\b([-\\\/\&\.]?) 
相關問題