我試圖在Python中實作一種模式,它可以識別區域代碼周圍有括號的情況(如果是這樣,可以有任何數量的前導或尾部空白)或沒有括號的情況(如果是這樣,區域代碼和下三個數字之間有一個連字符。具體來說:
(123) 456-7890是有效的 。
123-456-7890是有效的 。
(123) 456-7890是有效的 。
(123-456-7890是無效的#,因為,有一個開放的'(',但沒有封閉的小括號。如果沒有,那么在123和456之間需要一個連字符。如果兩者都有,那么沒有連字符,但在123和456之間有任何數量的空格。
123 456-7890不是有效的#,因為沒有括號,它在123和456之間應該有一個連字符
。我最初寫道。 pattern = re.compile(r'^ *(? [0-9]{3})?)-? *([0-9]{3})-?([0-9]{4}) *$')
但是很明顯,這并不奏效,因為小括號的問題是 "兩者或無"。
我也試過用組的or陳述句,但得到的結果是很奇怪的輸出。
pattern = re.compile(r'^ *(([0-9]{3}-?)|([0-9]{3}) *)([0-9]{3})-?
result = pattern.findall(input_string)
非常感謝您的幫助!
uj5u.com熱心網友回復:
許多正則運算式的問題是通過定義匹配演算法來解決的。
在你的案例中,它是有效的,它將給出(相當明確的):
在你的案例中,它是有效的。
A(s*(dd)s ddd-ddd|ddd-ddd-ddd)z
注意到轉義的小括號--否則它們只是在分組。
一個更緊湊的形式是:
A(s*(d{3})s |d{3}-)d{3}-d{4}z
順便說一下,在正則運算式中,s表示任何空格,d表示任何數字,(表示一個字面的開放括號等等。這些例子也允許使用制表符,如果你想限制只使用空格,你只需將s替換成空格:
A( *( d{3}) |d{3}-)d{3}-d{4}z
uj5u.com熱心網友回復:
字符|是regex中的邏輯'or'運算子,所以你可以嘗試:
r"(?:(d{3}) *?|d{3}-)d{3}-d{4}"/span>
部分
(d{3}) *?|d{3}-匹配括號內的三個數字(可能后面有空格)或三個數字后面有破折號。(?:)是一個非捕獲組 - 它表示里面的模式應該被匹配,但它不應該被
re.findall()單獨回傳。這里需要它,以便運算子|只應用于里面的兩個子模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323785.html
標籤:
