使用Reg Ex匹配数据框中的字符串并替换--python

时间:2018-04-06 20:35:21

标签: python regex python-3.x pandas strip

我的数据框看起来像这样

    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中的moreinfoGoCats行。

我的预期结果:

     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-020MZF8-050Z-AAB模式的案例,这样我就不必为所有可能的案例创建列表吗?< / p>

我能够像这样删除一行,但我希望能够删除数据框中的所有匹配案例

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,'')

任何建议都将不胜感激。感谢

3 个答案:

答案 0 :(得分:1)

你可以试试这个

(?:\w+-){2,}[^,\n]*

Demo

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

答案 1 :(得分:1)

这是一种更简单的方法,您可以在不使用正则表达式的情况下尝试。 pandas有许多内置函数来处理文本数据。

# 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)

答案 2 :(得分:0)

我建议您捕获您想要的数据,因为它非常特别,而您不想要的数据可能是任何数据。

您的模式应如下所示:

^\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+.*