Skip to main content
 首页 » 编程设计

python之在 pandas.DataFrame.str.replace 中组合多个正则表达式

2024年09月07日34kevingrace

我想通过删除括号来清理数据框中的一列。

1                          Auburn (Auburn University)[1] 
2                 Florence (University of North Alabama) 
3        Jacksonville (Jacksonville State University)[2] 
4             Livingston (University of West Alabama)[2] 
5               Montevallo (University of Montevallo)[2] 
6                              Troy (Troy University)[2] 
7      Tuscaloosa (University of Alabama, Stillman Co... 
8                      Tuskegee (Tuskegee University)[5] 
10         Fairbanks (University of Alaska Fairbanks)[2] 
12            Flagstaff (Northern Arizona University)[6] 

我使用了 unitowns['City'].str.replace('\(.*\)','').str.replace('\[.*\]','') 得到预期的结果如下-

1                            Auburn  
2                          Florence  
3                      Jacksonville  
4                        Livingston  
5                        Montevallo  
6                              Troy  
7                        Tuscaloosa  
8                          Tuskegee  
10                        Fairbanks  
12                        Flagstaff 

有没有办法组合这些表达式?此代码似乎不起作用 -> unitowns['City'].str.replace('(\(.*\)) | (\[.*\])','')

请您参考如下方法:

选项 1
str.extract/str.findall
与其删除不相关的内容,不如提取相关的内容?

df.City.str.extract(r'(.*?)(?=\()', expand=False) 

或者,

df.City.str.findall(r'(.*?)(?=\()').str[0] 

0          Auburn  
1        Florence  
2    Jacksonville  
3      Livingston  
4      Montevallo  
5            Troy  
6      Tuscaloosa  
7        Tuskegee  
8       Fairbanks  
9       Flagstaff  
Name: City, dtype: object 

您可能还想在提取后摆脱前导/尾随空格。您可以在结果上调用 str.strip -

df.City = df.City.str.extract(r'(.*?)(?=\()', expand=False).str.strip() 

或者,

df.City = df.City.str.findall(r'(.*?)(?=\()').str[0].str.strip() 

正则表达式详细信息

(      # capture group 
.*?    # non-greedy matcher 
) 
(?=    # lookahead 
\(     # opening parenthesis 
) 

选项 2
str.split
如果您的城市名称仅由一个词组成,str.split 也可以。

df.City.str.split('\s', 1).str[0] 
 
0          Auburn 
1        Florence 
2    Jacksonville 
3      Livingston 
4      Montevallo 
5            Troy 
6      Tuscaloosa 
7        Tuskegee 
8       Fairbanks 
9       Flagstaff 
Name: City, dtype: object 

选项 3
str.replace
压缩你的链接调用,你可以使用 -

df['City'].str.replace(r'\(.*?\)|\[.*?\]', '').str.strip() 
 
0          Auburn 
1        Florence 
2    Jacksonville 
3      Livingston 
4      Montevallo 
5            Troy 
6      Tuscaloosa 
7        Tuskegee 
8       Fairbanks 
9       Flagstaff 
Name: City, dtype: object