0

米国の電話番号の形式に合わせてコードを書いています

したがって、一致するはずです:

123-333-1111
(123)111-2222
123-2221111

ただし、1232221111 と一致するべきではありません

matchThreeDigits = r"(?:\s*\(?[\d]{3}\)?\s*)"
matchFourDigits = r"(?:\s*[\d]{4}\s*)"
phoneRegex = '('+ '('+  matchThreeDigits + ')' + '-?' +   '('+  matchThreeDigits + ')' + '-?' + '(' + matchFourDigits + ')' +')';
matches = re.findall(re.compile(phoneRegex),line)

問題は、() または '-' の少なくとも 1 つがパターンに存在することを確認する必要があることです (または、電話番号ではなく 9 桁の数字である可能性があります)。効率上の理由から、別のパターン検索を行いたくありません。この情報を正規表現パターン自体に収容する方法はありますか。

4

3 に答える 3

3

次の正規表現を使用できます。

regex = r'(?:\d{3}-|\(\d{3}\))\d{3}-?\d{4}'

(123)1112222それが許容されると仮定します。

は、それぞれ|or および\(および\)エスケープ(およびとして機能し)ます。

于 2013-11-06T08:12:29.247 に答える
2
import re
phoneRegex = re.compile("(\({0,1}[\d]{3}\)(?=[\d]{3})|[\d]{3}-)([\d]{3}[-]{0,1}[\d]{4})")
numbers = ["123-333-1111", "(123)111-2222", "123-2221111", "1232221111", "(123)-111-2222"]
for number in numbers:
    print bool(re.match(phoneRegex, number))

出力

True
True
True
False
False

この正規表現の説明は、http: //regex101.com/r/bA4fH8で確認できます。

于 2013-11-06T08:21:15.497 に答える