【问题标题】:Combine multiple regex expressions in pandas.DataFrame.str.replace?在 pandas.DataFrame.str.replace 中组合多个正则表达式?
【发布时间】:2018-06-16 22:51:20
【问题描述】:

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

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('(\(.*\)) | (\[.*\])','')

【问题讨论】:

    标签: python regex string pandas


    【解决方案1】:

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

    【讨论】:

    • 嘿,谢谢!这有帮助。虽然,我想结合正则表达式的原因是我有一些数据是多个单词,开头有数字,中间有括号。格式化要删除的内容会更容易!
    • @COLDSPEED 太棒了!非贪婪匹配器是关键!谢谢。 P.S-我最终使用了这个提取物!非常感谢!!
    • @Pranshu 不客气。如果有帮助,我将不胜感激accept the answer。单击我的答案旁边的灰色复选标记将其切换为绿色。
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多