在 pandas 数据框中使用正则表达式提取和替换子字符串

extracting and replacing substring using regex in a pandas dataframe

我有这个:

                                                Title  
Num                                                      
0    <span class="o-label--tiny">VALEUR ÉNERGÉTIQUE</span>   
1         <span class="o-label--tiny">PROTÉINES</span>   
2          <span class="o-label--tiny">GLUCIDES</span> 

<class 'pandas.core.frame.DataFrame'> Num Index(['Title'], dtype='object')

这就是我想要的:

            Title  
Num                                                      
0  VALEUR ÉNERGÉTIQUE   
1           PROTÉINES   
2            GLUCIDES 

这是我开发的正则表达式:

(<span class=\"o-label--tiny\">)([a-zA-Z]+\s*\w*)(</span>)

测试它我发现它匹配整个初始字符串并且有不同子字符串的组。最后,我想要 group(2) 在我的数据框列中。 (我下面的示例显示了显式正则表达式,但我也尝试了这些 re.compile 结果,这也无法让我得到我的最终结果)。

这是我试过的:

df['Title'] = df['Title'].replace({'<span class=\"o-label--tiny\">': ''}, inplace=True, regex=True)

结果:

   Title                                                
Num                                                         
0    None  
1    None  
2    None  

尝试数字 2:

df['Title'] = df['Title'].str.replace('<span class=\"o-label--tiny\">', repl = '')

结果编号 2:

   Title  
Num                                                         
0     NaN  
1     NaN  
2     NaN

尝试数字 3:

df['Title'] = df[lambda df: df.columns[0]].str.extract('(>[a-zA-Z]+\s*\w*)', expand=False)

结果 3:

   Title  
Num                                                         
0     NaN  
1     NaN  
2     NaN

我真的看不出我做错了什么,如果能帮助我达到我想要的结果,我们将不胜感激。谢谢!

使用str.extract:

df['Title']=df['Title'].str.extract('<span class=\"o-label--tiny\">(.*)</span>',expand=False)
print (df)
                  Title
Num                    
0    VALEUR ÉNERGÉTIQUE
1             PROTÉINES
2              GLUCIDES

如果可能不同 tags 或 classes:

df['Title'] = df['Title'].str.extract('>(.*)<',expand=False)
print (df)
                  Title
Num                    
0    VALEUR ÉNERGÉTIQUE
1             PROTÉINES
2              GLUCIDES

正则表达式

我不想输入 df 东西,但我希望这有用:

import re

stringa = """
0    <span class="o-label--tiny">VALEUR ÉNERGÉTIQUE</span>
1         <span class="o-label--tiny">PROTÉINES</span>
2          <span class="o-label--tiny">GLUCIDES</span>
"""

pattern1 = "[0-9]"
pattern = ">(.*)<"

found = re.findall(pattern1, stringa)
found2 = re.findall(pattern, stringa)

for f in range(len(found)):
    print(found[f] + " " + found2[f])

output

0 VALEUR ÉNERGÉTIQUE
1 PROTÉINES
2 GLUCIDES