【问题标题】:Pandas dataframe: split long regex into multiple linesPandas 数据框:将长正则表达式拆分为多行
【发布时间】:2021-04-17 15:47:12
【问题描述】:

我正在使用 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|NEXT|NGI|MDTS|RES|PPC|IND|FDC|CNL))*\b', value = r'<\g<0>>', 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)

不过,这在 Pandas 中不起作用。有什么我想念的想法吗?

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

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

在 9-7/8 LNR、LWD[GR、RES、APWD、SONVIS]、MDTS(PRESS 和 SAMP)上适合 13.72 ROT SWC, TSTG BOP

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

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

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一种选择是创建一个字符串列表,然后在调用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)
    

    使用re

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

    【讨论】:

    • 谢谢你的想法,克里斯。不过奇怪的是,我们不得不在 Pandas 中跳过这些类型的障碍。
    • @Heather 这更像是一个正则表达式问题。在 python 中,您可以使用 \ 来终止一行并在下一行继续。但是,正则表达式中的 \ 意味着不同的东西,所以这不是一个选项。也不能使用三引号""",因为每次返回都会插入一个\n
    • 如果是这样的话,使用stackoverflow.com/questions/33211404/…这里提到的正则表达式详细方法的建议怎么样?它特别提到三重引号表示正则表达式中的冗长。
    • @Heather 如果您想使用re.VERBOSE,那么您需要导入re 包并在字符串上使用re.compile,我将更新我的答案以将其反映为一个选项。无论哪种方式,您仍然需要“编译”字符串,无论是使用join 还是re.compile
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2018-02-05
    • 2020-07-22
    • 2011-12-21
    相关资源
    最近更新 更多