首页 > 解决方案 > 如何使用 Python 正则表达式删除除模式之外的所有内容

问题描述

我有一个熊猫数据框,在单列中有一些评级值。我的目标是为新系列提取一些标记。我有一个这样的唯一值列表:

['nan' 'AAA' 'AA+' 'AA' 'A+' 'A-' 'AA-' 'BB+' 'BBB' 'BBB-' 'A' 'BB-'
 'BBB+' 'B+' 'BB' 'B' 'A *-' 'A- *-' 'B-' 'CCC+' 'CCC' 'CCC-' 'CC' 'SD'
 'CCC+ *-' 'BB *-' 'BB- *-' 'B *-' 'B+ *-' 'B- *-' 'BBB+ *-' 'CCC- *-'
 'BBB- *-' 'BB+ *-' 'A+ *-' 'BBB *-' 'AAA *-' 'AA *-' 'AA- *-' 'NR']

因此,我正在尝试使用其他模式' *-'' *+'在删除之前创建一个新的数据框列,其中包含值'-'(对于以 结尾的评级' *-')、'+'(对于' *+'结束)和''/或nan其他评级类型。

简单的删除对我来说很清楚(类似于'( \*.)'中的模式re.sub),但问题是在执行此操作之前选择标记。我不是正则表达式方面的专家,所以我花了很多时间尝试re.sub用类似的模式探索函数'[^(\*.)]''[^(\*[\+\-])]'但没有结果。

标签: pythonregex

解决方案


您可以执行以下操作。

import pandas as pd
import re

df = pd.DataFrame({'col0':['nan', 'AAA', 'AA+', 'AA', 'A+', 'A-', 'AA-', 
'BB+', 'BBB', 'BBB-', 'A', 'BB-', 'BBB+', 'B+', 'BB', 'B', 'A *-',
 'A- *-', 'B-', 'CCC+', 'CCC', 'CCC-', 'CC', 'SD', 'CCC+ *-', 'BB *-',
 'BB- *-', 'B *-', 'B+ *-', 'B- *-', 'BBB+ *-', 'CCC- *-',
 'BBB- *-', 'BB+ *-', 'A+ *-', 'BBB *-', 'AAA *-', 'AA *-', 'AA- *-', 'NR']})

df['new_col'] = [re.search('([-+])$', x).group(0) 
    if re.search('([-+])$', x) else '' for x in df.col0]

哪个会给

       col0 new_col
0       nan        
1       AAA        
2       AA+       +
3        AA        
4        A+       +
5        A-       -
6       AA-       -
7       BB+       +
8       BBB        
9      BBB-       -
10        A        
11      BB-       -
12     BBB+       +
13       B+       +
14       BB        
15        B        
16     A *-       -
17    A- *-       -
18       B-       -
19     CCC+       +
20      CCC        
21     CCC-       -
22       CC        
23       SD        
24  CCC+ *-       -
25    BB *-       -
26   BB- *-       -
27     B *-       -
28    B+ *-       -
29    B- *-       -
30  BBB+ *-       -
31  CCC- *-       -
32  BBB- *-       -
33   BB+ *-       -
34    A+ *-       -
35   BBB *-       -
36   AAA *-       -
37    AA *-       -
38   AA- *-       -
39       NR        

我所做的是遍历列的行,然后检查最后一个字符是 a+还是 a -。如果是这样,它将它放在我称之为的第 0 组中。如果 a +or-未找到,None则返回一个评估为的对象,并返回False''。可以将此列表分配给新列。

如果您正在寻找字符串文字*-*+那么您需要进行此细微更改。

df['new_col'] = [re.search(r'\*([-+])$', x).group(0) 
    if re.search(r'\*([-+])$', x) else '' for x in df.col0]

对于它的价值,我测试了所有这些都是 Python 3.7 和 Pandas 0.25.1。


推荐阅读