【问题标题】:extract string betwen two strings in pandas在熊猫的两个字符串之间提取字符串
【发布时间】:2017-04-29 16:49:18
【问题描述】:

我有一个如下所示的文本列:

http://start.blabla.com/landing/fb603?&mkw...

我想提取“start.blabla.com” 总是介于:

http://

和:

/landing/

即:

start.blabla.com

我愿意:

df.col.str.extract('http://*?\/landing')

但它不起作用。 我做错了什么?

【问题讨论】:

  • 试试http://([^/]+)/landing
  • 有效!你能解释一下你的解决方案吗? @WiktorStribiżew
  • 您缺少捕获括号。
  • @xxxvinxxx:如果以下任何答案对您有用,请考虑点击左侧的✓ 接受答案。

标签: python regex pandas


【解决方案1】:

您的正则表达式匹配http:/,然后是0+ / 符号,然后是/landing。

您需要匹配并捕获http:// 之后的字符 (The extract method accepts a regular expression with at least one capture group.),而不是 /,1 次或多次。可以用

http://([^/]+)/landing
       ^^^^^^^

其中[^/]+ 是一个negated character class,它匹配除/ 之外的1+ 个字符。

见regex demo

【讨论】:

  • 为什么不http:\/\/(.*?)\/landing?
  • @MohammadYusufGhazi:因为.*? 导致不必要的“前向回溯”(惰性模式“扩展”),因此与否定字符类相比,正则表达式引擎需要更多“步骤”才能返回匹配项只抓取除/(此处)之外的1+个字符,然后检查/landing。使用.*?,在匹配http:// 之后已经搜索/landing 子字符串 - 我们知道它不在那里。此检查在主机值中的每个字符之后重复。人们经常说,对于应该使用简单字符串方法的情况,正则表达式“过大”。情况相同:如果[^/] 可以,请使用它。
  • 嗯。有趣的。谢谢你的解释。
  • 如果您想了解更多关于惰性模式如何工作的详细信息/示例,请参阅Can I improve performance of this regular expression further。
  • 顺便说一句,如果它对您有用,请考虑通过单击左侧的✓ 来接受答案。
【解决方案2】:

只是为了回答一个你没有问的问题,如果你想将字符串的几个部分提取到单独的列中,你可以这样做:

df.col.str.extract('http://(?P<Site>.*?)/landing/(?P<RestUrl>.*)')

你会得到类似的东西:

               Site        RestUrl
0  start.blabla.com  fb603?&mkw...

要了解这个正则表达式(以及任何其他正则表达式)是如何构建的,我建议您查看优秀的网站 regex101。我构建了一个 sn-p,您可以在其中看到上述正则表达式here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多