正規のフォーム(XXX)XXX-XXXまたはXXX-XXX-XXXXで書かれた電話番号を追加条件付きで取得する機能を作成しようとしています。これは私がこのテストケース' (404) 555-1212 '
を失敗していたが、SOの別の質問が(?:\)?\s*|-?)
で\)?\s*|-?
を置き換えるために私を提案し、それが動作Python正規表現での目的(?:...)
def parse_phone2(s):
phone_number = re.compile(r'''^\s*\(? # Begining of string, Ignore leading spaces
([0-9]{3}) # Area code
\)?\s*|-? # Match 0 or 1 ')' followed by 0 or more spaces or match a single hyphen
([0-9]{3}) # Three digit
-? # hyphen
([0-9]{4}) # four digits
\s*$ # End of string. ignore trailing spaces''', re.VERBOSE)
try:
return (phone_number.match(s).groups())
except AttributeError as e:
raise ValueError
私のアプローチです。問題は、非キャプチャグループを作成すること以外に、(?:...)
の目的と目的の違いを理解できないことです。ドキュメントは私にとっても十分明確ではありません。単にa
sおよびb
Sの(おそらく空の)文字列と一致
re.compile(r'(?:a|b)*')
:
https://docs.python.org/3/library/re.html
'(?:...)'は正規表現を構造化するのに使用できますが、通常の括弧とは異なり、キャプチャグループは作成されません。 –
疑問符文字「?」は、1回または0回に一致します。あなたはそれを何かをオプションにすると考えることができます。たとえば、home-?brewは自家製または自家製のいずれかと一致します。 –
@FadySaadそれは私の質問ではありません。私は '(?:\)?\ s * | - ?)'の代わりに '\)?\ s * | - ?' –