Python Pandas dataframe:将长正则表达式拆分为多行

Python Pandas dataframe:将长正则表达式拆分为多行,python,pandas,Python,Pandas,我正在使用Pandas进行一些数据清理,我有一个很长的正则表达式,我想把它分成多行。以下在熊猫身上很好,因为它们都在一条线上: df['REMARKS'] = df['REMARKS'].replace(to_replace =r'(?=[^\])}]*([\[({]|$))\b(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL)\b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?(?:GR|MDT|CMR|HLDS|NEX

我正在使用Pandas进行一些数据清理,我有一个很长的正则表达式,我想把它分成多行。以下在熊猫身上很好,因为它们都在一条线上:

df['REMARKS'] = df['REMARKS'].replace(to_replace =r'(?=[^\])}]*([\[({]|$))\b(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL)\b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL))*\b', value = r'<\g<0>>', regex = True)
(2)替换(替换)(替换)(替换(替换)(替换)(替换)(替换)(替换)(替换)(替换)(替换(替换)(((([目前:::)目前,([[[[[[[[[[[[[[124::)))\ b(?基码>df,[码码码:[码:[码:[码:[码:[码]MDT(CMR)MDT)CMR(CMR)MDT)MDT)CMR(CMR)CMR)MDD)MDD(MDD)MDD)下一个下一个,下一个,DFD(下一个,下一个,下一个(下一个)MDT,下一个(下一个)MDT,下一个,下一个,下一个,NGI;MDT,MDT,MDT(MDT)再下一个,MDT,再下一个,再下一个,MDT,本本,MDT,再,本本,本,再,再124; RES | PPC | IND | FDC | CNL |*\b',value=r',regex=True) 但是,这很难管理。我尝试了以下在常规Python中工作的详细方法:

df['REMARKS'] = df['REMARKS'].replace(to_replace =r"""(?=[^\])}]*([\[({]|$))
                                                      \b(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL)
                                                      \b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?
                                                      (?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL))*\b""", value = r'<\g<0>>', regex = True)
df['comments']=df['comments'].replace(to_replace=r”“(?=[^\])}]*([\[({]\$))
\b(?:GR | MDT | CMR | HLDS | NEXT | NGI | MDTS | RES | PPC | IND | FDC | CNL)
\b(?:\s*(?:,\s*)?(?:(?:或|和)\s+?
(?:GR | MDT | CMR | HLDS | NEXT | NGI | MDTS | RES | PPC | IND | FDC | CNL)*\b“”,value=r“”,regex=True)
不过,这在熊猫身上不起作用。你知道我遗漏了什么吗

以下是一些用于测试的示例文本:

GR、MDT、CMR、HLDS、NEXT、NGI@25273、COMPTG

在9-7/8 LNR、LWD[GR、RES、APWD、SONVIS]和MDT(冲压和SAMP)上安装13.72 ROT SWC、TSTG防喷器

LWD[GR,RES,APWD,SONVIS],GR,RES,NGI,PPC@31937,MDT(按& SAMP)TKG ROT SWC

LWD[GR,RES]@12586,IND,FDC,CNL,GR@12586,SWC,RAN CSG,PF 12240-12252,RR(新增信息)


谢谢!

一个选项是创建字符串列表,然后在调用
replace
时使用
join

RegEx = [r'(?=[^\])}]*([\[({]|$))\b(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL)',
         r'\b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?',
         r'(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL))*\b']

df['REMARKS'] = df['REMARKS'].replace(to_replace=''.join(RegEx), value=r'<\g<0>>', regex=True)

谢谢你的想法,Chris。不过,奇怪的是,我们不得不在Pandas中跳过这些类型的环。@Heather这更像是正则表达式的问题。在python中,你可以使用\来终止一行并在下一行继续。但是,\在正则表达式中的意思不同,因此这不是一个选项。还可以使用三重引号
“”"
不是一个选项,因为每个返回都会插入一个
\n
如果是这种情况,那么建议使用这里提到的regex-verbose方法如何?它特别提到三个引号表示regex中的verbose。@Heather如果要使用
re.verbose
则需要导入
re
package并在字符串上使用
re.compile
,我将更新我的答案以反映这一点作为一个选项。无论哪种方式,您仍然需要“编译”字符串,无论是使用
join
还是
re.compile
import re

s = r"""(?=[^\])}]*([\[({]|$))\b(?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL)
         \b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?
         (?:GR|MDT|CMR|HLDS|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL))*\b"""

df['REMARKS'] = df['REMARKS'].replace(to_replace=re.compile(s, re.VERBOSE), value=r'<\g<0>>')