質問: '-'.join([groups[1],groups[3],groups[5]]) if groups[8] != '': phone_num += ' x' + groups[8] matches.append(phone_num) for groups in email_regex.findall(text): matches.append(groups[0]) if len(matches)>0: pcl.copy('\n'.join(matches)) print('コピーしました') print('\n'.join(matches)) else: print('電話番号やメールアドレスは見つかりませんでした') ```
回答: `phone_regex.findall(text)`がどういうものになるかについては、結論からいうとタプルのリストになります。 例えば、textに`03-1111-2222`,`03-3333-4444`が含まれていると次のようになります。タブルは、正規表現にマッチした文字列と正規表現での8個のグループからできています。 ``` [('03-1111-2222', '03', '-', '1111', '-', '2222', '', '', ''), ('03-3333-4444', '03', '-', '3333', '-', '4444', '', '', '') ``` それで、`groups`には、リストにある順番(テキストにある順番)で、正規表現にマッチ電話番号とその正規表現でのグループからできたタプルが代入されます。タプルはシーケンス型なので`groups[1]`のようにして要素を取得します。なぜ、group ではなく groups としているのかというと、正規表現でのグループを複数含むためと思われます。 詳しくは、公式ドキュメントの re --- 正規表現操作から、`(...)`と`re.findall`の部分を引用しておきますので、公式ドキュメントをみてください。 > > (...) > > 丸括弧で囲まれた正規表現にマッチするとともに、グループの開始と終了を表します。グループの中身は以下で述べるように、マッチが実行された後で回収したり、その文字列中で以降 \number 特殊シーケンスでマッチしたりできます。リテラル '(' や ')' にマッチするには、( や ) を使うか、文字クラス中に囲みます: [(]、 [)] 。 > > > > > re.findall(pattern, string, flags=0) > > string 中の pattern による全ての重複しないマッチを、文字列のリストとして返します。 string は左から右へ走査され、マッチは見つかった順で返されます。パターン中に 1 つ以上のグループがあれば、グループのリストを返します。パターンに複数のグループがあればタプルのリストになります。空マッチは結果に含まれます。 > > >