尝试在 Python / pandas 中使用正则表达式获取子字符串

Posted

技术标签:

【中文标题】尝试在 Python / pandas 中使用正则表达式获取子字符串【英文标题】:Trying to get a substring using regex in 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,我在这里解释了它的原因 如果您的数据具有这种结构,您可以使用拆分方法并选择第二个索引。 【参考方案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 (.*) -')

【讨论】:

以上是关于尝试在 Python / pandas 中使用正则表达式获取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python(Pandas) - 我应该在这里使用哪种正则表达式语法?

Python Pandas Regex

使用正则表达式解析多个文本字段并编译成 Pandas DataFrame

用于各种日期的 Python/Pandas 正则表达式 [重复]

在 Pandas str.contains() 的正则表达式中使用变量

Python Pandas:使用正则表达式用超链接替换字符串