繁体   English   中英

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

[英]Extract substring from string using Python and regex

我在'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)

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

先感谢您。

您可以从URL中提取的查询字符串urllib.parse.urlparse ,然后分析它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])

你可以试试这个

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

说明

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

演示版

快速高效的熊猫方法。

示例数据:

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对标记列,那将是一个不同的提取后缀。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM