2015-04-14 69 views
0

我是Python編程新手。現在我正在努力簡化現有的代碼。以下是練習:制定一個格式,該格式與(xxx) xxx-xx-xxxxx-xxx-xx-xx格式的電話號碼相匹配。我到目前爲止:Python中的正則表達式。如何簡化我的例子?

patt = "\(?\d{3}\)?\s?-?\d{3}-\d{2}-\d{2}" 

它完美的作品。但問題是顯而易見的:如果我有一個可選模式,比如說,在某種固定模式之前有"(specific-patter-ffddff445%$#%)--ds",那麼我將不得不放置「?」在可選模式中的每個符號之前的符號。我怎樣才能把所有的符號組合起來,只放一個「?」標記?

+0

你的問題還不清楚。這是一個練習還是一個真正的問題?如果是後者,請刪除字符串中的所有非數字字符,並檢查是否留下了10位數字。這應該涵蓋所有特殊用例。 – alfasin

+0

我不確定我是否理解。你可以使用一個組來使一個子模式可選:'(?:xyz)?'使得整個字符串'xyz'是可選的。但是如果你想說每個字符都是可選的而不依賴於其他字符,你必須寫'x?y?z?'。沒有捷徑。 – Barmar

回答

1

所以你有什麼匹配各種不正確的格式。例如:

012)345-67-89
(012 345-67-89

你需要的是一個選項,它的正則表達式爲您提供:https://docs.python.org/3.4/library/re.html#regular-expression-syntax

喜歡的東西這將是優選的:

patt = '(?:\(\d{3}\) |\d{3}-)\d{3}-\d{2}-\d{2}' 

這將匹配要麼「(xxx)」或「xxx-」作爲「xxx-xx-xx」的前綴。並且不會匹配上面列出的錯誤字符串。

?應該只在它的操作是真正可選的情況下使用。

+0

謝謝,但我怎樣才能打印結果? – trollpidor

+0

@trollpidor所以這是第二個問題。這很好,我都是關於學習的。但我鼓勵你花一點時間來尋找答案是否在提問之前已經給出。在這種情況下,你可以在這裏找到答案:http://stackoverflow.com/q/26438345/2642059 –

+0

我明白。你的方法正是我想要的。謝謝 – trollpidor