所以,我在Pandas中有一个类似下面的df:
Name URL
X http://www.x.com/abc/xyz/url.html
X http://www.x.com/yyz/hue/end.html
Othername http://website.othername.com/abc.html
Othername http://home.othername.com/someword/word.html
Example http://www.example.com/999/something/index.html
我想,使用正则表达式(我猜)添加一个" Extract"专栏,如下:
Name URL Extract
X http://www.x.com/abc/xyz/url.html abc
X http://www.x.com/yyz/hue/end.html yyz
Othername http://website.othername.com/abc.html website
Othername http://home.othername.com/someword/word.html home
Example http://www.example.com/999/something/index.html 999
如您所见,我想要提取的部分因网站而异。所以,对于价值' X'在' Name'下,我必须应用一个正则表达式模式。对于' Othername',另一种模式。
我有6种不同的(和6种不同的模式)。
我尝试使用' where',但我可以让它仅适用于其中一个网站,而不是考虑多个条件。如下:
df['Extract'] = np.where(df['Name'] == 'X', df.URL.str.extract(r'www\.x\.com\/(.*?)/'),'')
我也试过为此创建一个函数:
def ext(c):
if c['Name'] == 'X':
c.URL.str.extract(r'www\.x\.com\/(.*?)/')
elif c['Name'] == 'Example':
c.URL.str.extract(r'www\.example\.com\/(.*?)/')
(...)
else:
return ''
df['Extract'] = df.apply(ext)
df
如何根据'姓名'
的不同方式进行此项工作?答案 0 :(得分:1)
试试这个:
In [87]: df['Extract'] = (df.URL.replace([r'http[s]?://www\.[^/]*\/', r'http[s]?://'], ['',''], regex=True)
...: .str.extract(r'([^/.]*)', expand=False))
...:
In [88]: df
Out[88]:
Name URL Extract
0 X http://www.x.com/abc/xyz/url.html abc
1 X http://www.x.com/yyz/hue/end.html yyz
2 Othername http://website.othername.com/abc.html website
3 Othername http://home.othername.com/someword/word.html home
4 Example http://www.example.com/999/something/index.html 999
答案 1 :(得分:0)
您可以使用条件正则表达式:
import re
rx = re.compile(r'https?://(www)?(?(1)[^/+]+/([^/]+)|([^.]+))')
def extract(col):
m = rx.match(col)
if m is not None:
return m.group(3) if m.group(3) is not None else m.group(2)
else:
return ''
df['Extract'] = df['URL'].apply(extract)
这假设您在/
后查找子域名为www
的子域名本身时的第一部分。
https?:// # match http:// or https.//
(www)? # capture www into group 1 if it is there
(?(1) # check if it was matched
[^/+]+/ # ... and if so fast forward ...
([^/]+) # capture it into group 2
| # else
([^.]+) # otherwise capture the part directly after http://
) # into group 3