python - 如何使用 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
用类似的模式探索函数'[^(\*.)]'
,'[^(\*[\+\-])]'
但没有结果。
解决方案
您可以执行以下操作。
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。
推荐阅读
- python - 关于函数类和类方法的Python问题
- javascript - 确认表单提交 HTML/Javascript 后刷新页面
- javascript - 使用 XAMPP 在本地主机上的 php 邮件遇到一些问题
- python - 无法在 Python 中合成两个图像
- routes - 我如何路由已发布的库组件
- javascript - 如何使用可变参数删除 Div?
- php - Laravel - 按关系收集订单
- python - 通过类获取两个元素的坐标,将第一个坐标拖到Selenium中的第二个坐标
- r - 使用 dplyr 的行绑定列表列
- gitlab - GitLab 页面 - 用户页面在自定义域下提供,但用户的项目页面不是