teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

Update

2021/12/30 17:46

投稿

melian
melian

スコア21265

answer CHANGED
@@ -61,4 +61,22 @@
61
61
  # 最後の内包表記ではマッチする名前がない email に関しては
62
62
  # corresponding_name を空文字列('')に置き換えています
63
63
  [j[0] if j else '' for j in [ ... ]]
64
+ ```
65
+
66
+ **追記 Part 2**
67
+
68
+ > 以下の組み合わせについては抽出することができないようです。
69
+ > `email=hidehikaneko-abc@gmail.com`, `names=Kaneko Hidehiro; Itoh Hidetaka`
70
+
71
+ > names列の姓と名を入れ替えて、…
72
+
73
+ 姓と名を入れ替えて、で思い付いた事がありまして、以下の様に書き替えてみました。これで `Kaneko Hidehiro` も抽出できます。
74
+
75
+ ```python
76
+ df_email_with_names['corresponding_name'] = [
77
+ j[0] if j else '' for j in [[
78
+ i for i in n
79
+ if any(re.search(r'.*?'.join([*e]), j, re.IGNORECASE)
80
+ for j in (i, re.sub(r'^(.+?)\s+(.+)', r'\2 \1', i)))
81
+ ] for e, n in zip(emails, names)]]
64
82
  ```

1

Update

2021/12/30 17:46

投稿

melian
melian

スコア21265

answer CHANGED
@@ -30,4 +30,35 @@
30
30
  1 hisaishi.m@gmail.com Uchida Kiwamu; Hisaishi Makoto Hisaishi Makoto
31
31
  2 yasuko-oyama@gmail.com Oyama Yasuko
32
32
  3 ksaki@gmail.com Inoue Yuta; Yamasaki Toru; Kawaguchi Saki Kawaguchi Saki
33
+ ```
34
+ **追記**
35
+
36
+ > `df_email_with_names['corresponding_name']` のコードについて、噛み砕いてどのような動作をしているのか
37
+
38
+ `email` を `ksaki@gmail.com`, `names` を `Inoue Yuta; Yamasaki Toru; Kawaguchi Saki` の場合で説明してみます。
39
+
40
+ ```python
41
+ [j[0] if j else '' for j in [
42
+ [i for i in n if re.search(r'.*?'.join([*e]), i, re.IGNORECASE)]
43
+ for e, n in zip(emails.values[:,0], names)]]
44
+
45
+ # zip の部分の e と n
46
+ for e, n in zip(emails.values[:,0], names)
47
+ e => 'ksaki'
48
+ n => ['Inoue Yuta', 'Yamasaki Toru', 'Kawaguchi Saki']
49
+
50
+ # 次の内包表記で names と照合
51
+ [i for i in n if re.search(r'.*?'.join([*e]), i, re.IGNORECASE)]
52
+ # email 文字列を一文字づつに分解して '.*?' で join
53
+ r'.*?'.join([*e]) => r'k.*?s.*?a.*?k.*?i'
54
+ # names と照合(大文字・小文字の違いは無視)、'Kawaguchi Saki' にマッチ
55
+ re.search(r'.*?'.join([*e]), i, re.IGNORECASE)
56
+ =>
57
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Inoue Yuta', re.IGNORECASE)
58
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Yamasaki Toru', re.IGNORECASE)
59
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Kawaguchi Saki', re.IGNORECASE)
60
+
61
+ # 最後の内包表記ではマッチする名前がない email に関しては
62
+ # corresponding_name を空文字列('')に置き換えています
63
+ [j[0] if j else '' for j in [ ... ]]
33
64
  ```