从字符串列python中提取子字符串

时间:2020-06-14 14:53:46

标签: python pandas string

我有一个这样的数据框:

name      link
apple    example1.com/dsa/es?id=2812168&width=1200/web/map&resize.html
banana.  example2.com/es?id=28132908&width=1220/web/map_resize.html
orange.  example3.com/es?id=3209908&width=1120/web&map_resize.html

每个名称的ID都埋在链接中,链接的结构可能不同。但是,我知道模式是'id ='+'我想要什么'+'&'

我想知道,是否有一种方法可以从id中提取link并将其放回数据框以获取以下内容:

name      link
apple    2812168
banana.  28132908
orange.  3209908

我尝试使用它:

df['name'] = df['name'].str.extract(r'id=\s*([^\.]*)\s*\\&', expand=False)

但它返回包含所有nan

的列

此外,链接中可能有多个&

3 个答案:

答案 0 :(得分:2)

我们可以使用positive lookbehindpositive lookahead

df['link'] = df['link'].str.extract('(?<=id\=)(.*?)(?=\&)')


      name      link
0    apple   2812168
1  banana.  28132908
2  orange.   3209908

详细信息

  • (?<=id\=):对id=的积极回望
  • (.*):一切
  • (?=\&width):积极回顾&width

答案 1 :(得分:2)

我认为Ids始终是数字,因此这有点干净:

df["link"] = df['link'].str.extract(r'id=(\d+)&', expand=False)
print(df)
#     name      link
#0   apple   2812168
#1  banana  28132908
#2  orange   3209908

答案 2 :(得分:2)

让三split

df['link'].str.split('id=').str[1].str.split('&').str[0]
0     2812168
1    28132908
2     3209908
Name: link, dtype: object