使用Python和regex从字符串中提取子字符串

时间:2018-12-11 16:24:03

标签: python regex pandas

我在'page'列中有一个包含非常长字符串的pandas数据框,我试图从中提取一个子字符串:

示例字符串: / ex / search /!tu / p / z1 / zVJdb4IwFP0r88HH0Sp-hK / dz / d5 / L2dBISEvZ0FBIS9nQSEh /?s& search_query =示例一&y = 0&x = 0

使用正则表达式,我很难确定如何提取两个与号之间的字符串,以及如何删除较大字符串中的所有其他字符。

到目前为止,我的代码如下:

import pandas as pd
import re

dataset = pd.read_excel(r'C:\Users\example.xlsx')
dataframe = pd.DataFrame(dataset)

dataframe['Page'] = format = re.search(r'&(.*)&',str(dataframe['Page']))

dataframe.to_excel(r'C\Users\output.xlsx)

上面的代码可以运行,但是不会输出任何内容到我的新电子表格中。

谢谢。

3 个答案:

答案 0 :(得分:4)

您可以使用urllib.parse.urlparse从URL中提取查询字符串,然后使用urllib.parse.parse_qs进行解析:

>>> from urllib.parse import urlparse, parse_qs
>>> path = '/ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0'
>>> query_string = urlparse(path).query  
>>> parse_qs(query)
{'search_query': ['example one'], 'y': ['0'], 'x': ['0']}

编辑:要从query_string列的所有页面中提取Page

dataframe['Page'] = dataframe['Page'].apply(lambda page: parse_qs(urlparse(page).query)['search_query'][0])

答案 1 :(得分:1)

您可以尝试

(?<=&).*?(?=&)
  

说明

  • (?<=&)-向后看。匹配&
  • (.*?)-匹配除换行符以外的所有内容。 (惰性方法)。
  • (?=&)-正向超前匹配&

Demo

答案 2 :(得分:0)

快速高效的熊猫方法。

示例数据:

temp,page
1,  /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0
2,  /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0
3,  /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0

代码:

df = example.data # from above
df["query"] = df['page'].str.split("&", expand=True)[1].str.split("=", expand=True)[1]
print(df)

示例输出:

   temp  \
0  1          
1  2          
2  3          

                                                                                                          page  \
0    /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0   
1    /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0   
2    /ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp-hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&search_query=example one&y=0&x=0   

         query  
0  example one  
1  example one  
2  example one  

如果您想基于key = value对标记列,那将是不同的提取后缀。