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

时间:2018-01-07 22:31:57

标签: python regex string pandas

我在数据框中有一个列,我想通过删除括号来清理它。

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 个答案:

答案 0 :(得分:2)

选项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