【问题标题】:Extract strings from pandas df using regex使用正则表达式从 pandas df 中提取字符串
【发布时间】:2021-12-05 19:55:24
【问题描述】:

我需要 Python Pandas 数据框的正则表达式方面的帮助。 测试字符串是:

s = pd.Series(['xslF345X03/was-form4_163347386959085.xml', 'xslF345X03/wf-form4_163347386959085.xmlasdf', 'xslF345/X03/wf-form4_163347386959085.xml'])

我想:

  • 从最后一个 '/' 开始提取到最后的 '.xml'
  • 仅在字符串以 '.xml' 结尾时提取

所以我得到这样的东西:

xslF345X03/was-form4_163347386959085.xml      Extract: /was-form4_163347386959085.xml
xslF345X03/wf-form4_163347386959085.xmlasdf   Do not extract because the ending is not .xml
xslF345/X03/wf-form4_163347386959085.xml      Extract starting from the last '/' character: /wf-form4_163347386959085.xml

我想我需要遵循 pandas 代码来使用正则表达式进行提取:

s.str.extract(...)

提前谢谢你:-)

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    要从最后一个“/”字符(包括/.xml的结尾提取,请使用str.extract(),如下所示:

    s.str.extract(r'(/(?!.*/).*\.xml)$')
    

    Regex Demo

    正则表达式详细信息:

    ( - 开始为str.extract() 捕获组

    / - 匹配符号/字面意思

    (?!.*/) - 负前瞻正则表达式在它之后断言没有其他符号 / (即确保符号 / 是最后一个

    .* - 匹配零个或多个字符

    \. - 逐字匹配一个点(转义以避免与正则表达式元字符混淆)

    xml - 匹配字符串xml 字面意思

    ) - str.extract() 的捕获组结束

    $ - 在行尾断言(以确保 .xml 在末尾)

    结果:

                                    0
    0  /was-form4_163347386959085.xml
    1                             NaN
    2   /wf-form4_163347386959085.xml
    

    【讨论】:

      【解决方案2】:

      使用str.extract:

      >>> s.str.extract(r'.*/(.*\.xml)$')
                                     0
      0  was-form4_163347386959085.xml
      1                            NaN
      2   wf-form4_163347386959085.xml
      

      【讨论】:

        【解决方案3】:

        您可以与str.endswith 核对,然后传递给np.where

        np.where(s.str.endswith('.xml'),s.str.rsplit('/',n=1).str[-1],np.nan)
        Out[99]: 
        array(['was-form4_163347386959085.xml', nan,
               'wf-form4_163347386959085.xml'], dtype=object)
        

        【讨论】:

        • 您好 BENY,感谢您的回答。我知道您的解决方案有效,但由于性能问题,我阻止了它。因此,我希望使用“提取”和正则表达式在一次操作中完成。您认为您的解决方案的性能与“extract”+regex 相比差别很大还是差别很小?
        猜你喜欢
        • 2017-02-07
        • 2014-10-17
        • 2014-08-25
        • 1970-01-01
        • 2010-10-14
        • 2018-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多