使用Python和正则表达式从字符串中提取子字符串

使用Python和正则表达式从字符串中提取子字符串,python,regex,pandas,Python,Regex,Pandas,我在“页面”列中有一个包含很长字符串的pandas数据帧,我正试图从中提取一个子字符串: 示例字符串:/ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&搜索\查询=示例一&y=0&x=0 使用正则表达式,我很难确定如何提取两个符号之间的字符串,并删除较大字符串的所有其他字符部分 到目前为止,我的代码如下所示: import pandas as pd import re dataset = pd.re

我在“页面”列中有一个包含很长字符串的pandas数据帧,我正试图从中提取一个子字符串:

示例字符串:/ex/search/!tu/p/z1/zVJdb4IwFP0r88HH0Sp hK/dz/d5/L2dBISEvZ0FBIS9nQSEh/?s&搜索\查询=示例一&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中提取查询字符串,然后使用以下内容对其进行解析:

编辑:
页面
列中的所有页面提取
查询字符串

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

您可以使用从URL提取查询字符串,然后使用以下方法对其进行解析:

编辑:
页面
列中的所有页面提取
查询字符串

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
代码:

示例输出:

   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对为列添加标签,那么这将是一种不同的提取后缀。

快速有效的方法

示例数据:

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
代码:

示例输出:

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

欢迎这样做!将一些示例数据作为文本包含总是很有帮助的。最简单的方法是将
df.head()
的输出粘贴到问题中的代码块中,方法类似于
dataframe.Page.str.split(“&”).str[1]
?可能,
dataframe['Page'].str.extract(r'&([^&]+)&'))
可以。此外,解析数据帧的字符串表示形式只是自找麻烦。而不是对字符串序列进行操作。啊,我明白了。感谢您澄清这一点。欢迎这样做!将一些示例数据作为文本包含总是很有帮助的。最简单的方法是粘贴
df.head()的输出
放入问题中的代码块类似于
dataframe.Page.str.split(&”).str[1]
?可能是
dataframe['Page'].str.extract(r'&([^&]+)&'))
就可以了。此外,解析数据帧的字符串表示形式只是自找麻烦。而不是对字符串序列进行操作。啊,我明白了。感谢您澄清这一点。您可能想补充一点,这应该像使用
dataframe.Page.apply(parseqs)一样使用
或类似。有没有更好的编程方法?我有几千行数据,每个单元格都是唯一的字符串。因此,您想从每个路径提取
查询字符串的值?非常感谢您的帮助,先生。这是我成功使用的解决方案。我更新了一点答案。结果是在将查询字符串传递给
parseqs
之前,需要首先提取查询字符串。鉴于数据的结构,这是不必要的,但它会因不同的输入而中断。您可能需要添加这样的内容,即应像
dataframe.Page.apply(parseqs)一样使用查询字符串
或类似。有没有更好的编程方法?我有几千行数据,每个单元格都是唯一的字符串。因此,您想从每个路径提取
查询字符串的值?非常感谢您的帮助,先生。这是我成功使用的解决方案。我更新了一点答案。结果是在将查询字符串传递给
parseqs
之前,需要先提取查询字符串。鉴于数据的结构,这是不必要的,但它会因不同的输入而中断。