尝试在 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) - 我应该在这里使用哪种正则表达式语法?
使用正则表达式解析多个文本字段并编译成 Pandas DataFrame
用于各种日期的 Python/Pandas 正则表达式 [重复]