【问题标题】:Regex loop stops after 60 iterations正则表达式循环在 60 次迭代后停止
【发布时间】:2019-07-15 11:42:10
【问题描述】:

我正在尝试找到一个正则表达式模式并将其放入数据框列中,同时遍历另一列的值。

问题:直到第 60 次迭代之前它都可以创造奇迹,但它只显示 NaN。我有 400 000 个条目,其中大部分应该匹配。

为什么会这样,我该如何解决?

import re

new_mail = []
for urlcore in re.finditer('https*://[www.]*(\S*).*\.(fr|com)',str(df['Site_Web'])):
    yolo = urlcore.group(1)
    new_mail.append(yolo)

df['urlcore'] = pd.Series(new_mail)
df['urlcore'] = df['urlcore'].str.replace('.', '', regex=True).replace('-', '', regex=True)

【问题讨论】:

  • 您是否使用应该匹配但不匹配的正则表达式字符串测试了上面的字符串?可能是你需要修改正则表达式。
  • 你的正则表达式看起来很奇怪,[www.] mach with waaaaabbb abb, -----.`` and the part in the core (\S*). match wit someting lik this google-------------------。 com`
  • Edit你的问题并在df['Site_Web']中显示三行
  • 尝试使用https*:\/\/(www\.)?.*\.(fr|com)
  • ThomasAyoub 你需要在https? 中使用?,因为* 与httpssss 匹配

标签: python regex for-loop


【解决方案1】:

正确的正则表达式是:

(?:https?://)?(?:www\.)?([a-zA-Z0-9][a-zA-Z0-9-]{1,61})\.[a-zA-Z]{2,}

请注意,您在正则表达式中有三个未命名的组,但第一个和第二个没有被捕获,因此访问核心部分应该是 urlcore.group(1)

在您的情况下,您需要更改 (fr|com) 的结尾部分,如果您需要处理子域,还需要修改正则表达式以处理以前的可选组 (?:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}\.)*

【讨论】:

    【解决方案2】:

    由于(\S*).*,您的正则表达式会出现性能问题。改成https?:\/\/(www\.)?(\S*)\.(fr|com)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多