我有看起来像这样的数据框
value
0 A067-M4FL-CAA-020
1 MRF2-050A-TFC,60 ,R-12,HT
2 moreinfo
3 MZF8-050Z-AAB
4 GoCats
5 MZA2-0580-TFD,60 ,R-669,LT
我希望能够使用正则表达式剥离,60 ,R-12,HT
,并从 DF 中删除moreinfo
行和GoCats
行。
我的预期结果:
value
0 A067-M4FL-CAA-020
1 MRF2-050A-TFC
2 MZF8-050Z-AAB
3 MZA2-0580-TFD
我首先删除了字符串
del = ['hello', 'moreinfo']
for i in del:
df = df[value!= i]
有人可以建议一种使用正则表达式来匹配和删除所有与A067-M4FL-CAA-020
或MZF8-050Z-AAB
模式匹配的情况的方法,这样我就不必为所有可能的情况创建列表吗?
我能够像这样剥离一行,但我希望能够剥离数据帧中的所有匹配案例
pattern = r',w+ ,w+-w+,w+ *'
line = 'MRF2-050A-TFC,60 ,R-12,HT'
for i in re.findall(pattern, line):
line = line.replace(i,'')
>>> MRF2-050A-TFC
我尝试调整我的代码,但它为每一行打印出相同的输出
pattern = r',w+ ,w+-w+,w+ *'
for d in df:
for i in re.findall(pattern, d):
d = d.replace(i,'')
任何建议将不胜感激。谢谢
你可以试试这个
(?:w+-){2,}[^,n]*
演示
Python 脚本可能如下所示
ss="""0 A067-M4FL-CAA-020
1 MRF2-050A-TFC,60 ,R-12,HT
2 moreinfo
3 MZF8-050Z-AAB
4 GoCats
5 MZA2-0580-TFD,60 ,R-669,LT"""
import re
regx=re.compile(r'(?:w+-){2,}[^,n]*')
m= regx.findall(ss)
for i in range(len(m)):
print("%d %s" %(i, m[i]))
输出为
0 A067-M4FL-CAA-020
1 MRF2-050A-TFC
2 MZF8-050Z-AAB
3 MZA2-0580-TFD
这是一种更简单的方法,您可以在不使用正则表达式的情况下尝试。 熊猫有许多内置函数来处理文本数据。
# remove unwanted values
df['value'] = df.value.str.replace(r'moreinfo|60|R-.*|HT|GoCats|,', '')
# drop na
df = df[(df != '')].dropna()
# print
print(df)
value
0 A067-M4FL-CAA-020
1 MRF2-050A-TFC
3 MZF8-050Z-AAB
5 MZA2-0580-TFD
-----------
# data used
df = pd.read_fwf(StringIO(u'''
value
0 A067-M4FL-CAA-020
1 MRF2-050A-TFC,60 ,R-12,HT
2 moreinfo
3 MZF8-050Z-AAB
4 GoCats
5 MZA2-0580-TFD,60 ,R-669,LT'''),header=1)
我建议捕获您想要的数据,因为它非常特殊,并且您不想要的数据可能是任何东西。
您的模式应如下所示:
^w{4}-w{4}-w{3}(?:-d{3})?
https://regex101.com/r/NtH2Ut/2
我建议在可能的情况下比w
更具体。 (像^[A-Z]w{3}
一样(如果您知道开头的四个字符块应该以字母开头。
编辑抱歉,我可能没有从字面上充分阅读您的输入和输出:
https://regex101.com/r/NtH2Ut/3
^(?:d+s+w{4}-w{4}-w{3}(?:-d{3})?)|^s+.*