回答編集履歴

2

Update

2021/12/30 17:46

投稿

melian
melian

スコア20655

test CHANGED
@@ -125,3 +125,39 @@
125
125
  [j[0] if j else '' for j in [ ... ]]
126
126
 
127
127
  ```
128
+
129
+
130
+
131
+ **追記 Part 2**
132
+
133
+
134
+
135
+ > 以下の組み合わせについては抽出することができないようです。
136
+
137
+ > `email=hidehikaneko-abc@gmail.com`, `names=Kaneko Hidehiro; Itoh Hidetaka`
138
+
139
+
140
+
141
+ > names列の姓と名を入れ替えて、…
142
+
143
+
144
+
145
+ 姓と名を入れ替えて、で思い付いた事がありまして、以下の様に書き替えてみました。これで `Kaneko Hidehiro` も抽出できます。
146
+
147
+
148
+
149
+ ```python
150
+
151
+ df_email_with_names['corresponding_name'] = [
152
+
153
+ j[0] if j else '' for j in [[
154
+
155
+ i for i in n
156
+
157
+ if any(re.search(r'.*?'.join([*e]), j, re.IGNORECASE)
158
+
159
+ for j in (i, re.sub(r'^(.+?)\s+(.+)', r'\2 \1', i)))
160
+
161
+ ] for e, n in zip(emails, names)]]
162
+
163
+ ```

1

Update

2021/12/30 17:46

投稿

melian
melian

スコア20655

test CHANGED
@@ -63,3 +63,65 @@
63
63
  3 ksaki@gmail.com Inoue Yuta; Yamasaki Toru; Kawaguchi Saki Kawaguchi Saki
64
64
 
65
65
  ```
66
+
67
+ **追記**
68
+
69
+
70
+
71
+ > `df_email_with_names['corresponding_name']` のコードについて、噛み砕いてどのような動作をしているのか
72
+
73
+
74
+
75
+ `email` を `ksaki@gmail.com`, `names` を `Inoue Yuta; Yamasaki Toru; Kawaguchi Saki` の場合で説明してみます。
76
+
77
+
78
+
79
+ ```python
80
+
81
+ [j[0] if j else '' for j in [
82
+
83
+ [i for i in n if re.search(r'.*?'.join([*e]), i, re.IGNORECASE)]
84
+
85
+ for e, n in zip(emails.values[:,0], names)]]
86
+
87
+
88
+
89
+ # zip の部分の e と n
90
+
91
+ for e, n in zip(emails.values[:,0], names)
92
+
93
+ e => 'ksaki'
94
+
95
+ n => ['Inoue Yuta', 'Yamasaki Toru', 'Kawaguchi Saki']
96
+
97
+
98
+
99
+ # 次の内包表記で names と照合
100
+
101
+ [i for i in n if re.search(r'.*?'.join([*e]), i, re.IGNORECASE)]
102
+
103
+ # email 文字列を一文字づつに分解して '.*?' で join
104
+
105
+ r'.*?'.join([*e]) => r'k.*?s.*?a.*?k.*?i'
106
+
107
+ # names と照合(大文字・小文字の違いは無視)、'Kawaguchi Saki' にマッチ
108
+
109
+ re.search(r'.*?'.join([*e]), i, re.IGNORECASE)
110
+
111
+ =>
112
+
113
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Inoue Yuta', re.IGNORECASE)
114
+
115
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Yamasaki Toru', re.IGNORECASE)
116
+
117
+ re.search(r'k.*?s.*?a.*?k.*?i', 'Kawaguchi Saki', re.IGNORECASE)
118
+
119
+
120
+
121
+ # 最後の内包表記ではマッチする名前がない email に関しては
122
+
123
+ # corresponding_name を空文字列('')に置き換えています
124
+
125
+ [j[0] if j else '' for j in [ ... ]]
126
+
127
+ ```