【问题标题】:Trying to get a substring using regex in Python / pandas尝试在 Python / pandas 中使用正则表达式获取子字符串
【发布时间】:2019-07-06 03:08:18
【问题描述】:

我知道这可能看起来很愚蠢,但我一直在到处寻找并尝试使用正则表达式并徒劳无功。我的脚本永远不会适用于我在数据集上拥有的所有类型的字符串。

我的这一列包含看起来像(三种情况)的原始数据:

20181223-FB-BOOST-AAAA-CC Auchy-Les-Mines - Père Noel
20161224-FB-BOOST-SSSS-CC LeMarine - XXX XXX
20161223-FB-BOOST-XXXX-CC Bonjour le monde - Blah blah

所以我想要做的是在 CC 之后和“-”之前获取中间的字符串。我写了一个脚本,它确实适用于第二种情况,但不适用于其他两种情况:

1st case: Auchy-Les-Mines
2nd case: LeMarine
3rd case: Bonjour le monde

这是我使用但不适用于所有情况的正则表达式:regex = r"\s\b.*-."

提前致谢!

【问题讨论】:

  • str.extract(r'-CC\s*(.*?)\s+-')?见regex101.com/r/2LagAy/1
  • @WiktorStribiżew 您不需要在开头输入空格,该正则表达式的更好方法是“-CC.*?\s-”
  • @PabloAlvarez 请参阅my answer,我在这里解释了它的原因
  • 如果您的数据具有这种结构,您可以使用拆分方法并选择第二个索引。

标签: python regex pandas substring data-cleaning


【解决方案1】:

你我的用处

df['Col'].str.extract(r'-CC\s+(.*?)\s+-')

the regex demo

模式详情

  • -CC - 文字子串
  • \s+ - 1+ 个空格
  • (.*?) - 第 1 组(此值将由 .str.extract 返回):除换行符之外的任何 0+ 个字符,尽可能少
  • \s+ - 1+ 个空格(+ 在这里很重要)
  • - - 一个连字符

(.*?) 两端都有 \s+ 模式这一事实将确保无论有多少空格,结果都已从空格中删除。

【讨论】:

  • 完美运行!非常感谢,特别感谢您解释模式细节!你刚刚拯救了我的一天!谢谢:)!
  • 已经完成 :) !不然又出问题了哈哈!我有一些看起来像这样的行:20180223-FB-BOOST-XXX-CC Vitrolles - 110 - St Valentin 我只想检索“Vitrolles”我得到这个输出而不是使用你建议的正则表达式:Vitrolles - 110 所以我修复了它使用以下正则表达式: (r'-CC\s+(.*?)\s+-[^1-9]') (显然,它没有变成绿色,因为他们说我需要更多的声誉才能投票: ( )
  • @helloworld 查看最新更新,不需要[^1-9]。请考虑单击左侧的灰色刻度线以接受解决方案。不要关注左边的1,不代表采纳答案。
  • 同样的问题!它重新分配了数字,这不是预期的结果! [^1-9] 仍然可以胜任! Wdu 认为?
  • @helloworld 好的,这已经是只有你知道如何执行的微调了。所以,- 后面应该没有数字吧?因此,r'-CC\s+(.*?)\s+-' 似乎已经完成了您需要的操作,但您也可以使用 r'-CC\s+(.*?)\s+-(?!\s*\d)' 来避免匹配后跟 0+ 个空格和一个数字的 -
【解决方案2】:

你可以很简单地做到这一点:

result = df.raw_data.str.extract(r'-CC (.*) -')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2017-06-07
    • 2011-06-26
    相关资源
    最近更新 更多