【问题标题】:function returns only None values when replacing pandas column values by regex match通过正则表达式匹配替换熊猫列值时,函数仅返回 None 值
【发布时间】:2021-12-20 04:27:34
【问题描述】:

目标:将que_text 列中的值替换为 re.search 模式的匹配项。否则None

问题:尽管正则表达式模式经过全面测试,但在 que_text_new 列中仅接收 None 值!

def override(s):
    x = re.search(r'(an|frage(\s+ich)?)\s+d(i|ı)e\s+Staatsreg(i|ı)erung(.*)(Dresden(\.|,|\s+)?)?', str(s), flags = re.DOTALL | re.MULTILINE))
    if x :
        return x.group(5)
    return None
df2['que_text_new'] = df2['que_text'].apply(override)

我做错了什么?删除 return None 没有帮助。我假设我的函数中一定存在一些结构性错误。

【问题讨论】:

  • 能否请您发布您的数据框样本?没有它,几乎不可能提供帮助。
  • s在哪里使用了override函数?
  • 不知道,我认为s 应该是任意占位符,就像在循环中一样?!
  • 不,您需要一个输入字符串作为re.search 方法的第二个参数。在编辑问题之前,您有str(s)(这就是我在回答中提到它的原因)。

标签: python regex pandas


【解决方案1】:

您可以使用带有单个捕获组的模式,然后简单地使用 Series.str.extract 和链 .fillna(np.nan)NaN 填充不匹配的值:

pattern = r'(?s)(?:an|frage(?:\s+ich)?)\s+d[iı]e\s+Staatsreg[iı]erung(.*)'
df2['que_text_new'] = df2['que_text'].astype(str).str.extract(pattern).fillna(np.nan)

不确定你是否需要.astype(str),但你的代码中有str(s),所以这部分可能更安全。

这里,

  • 使用单个字符替代的捕获组将转换为 字符类,例如(i|ı) -> [iı]
  • 其他捕获组转换为非捕获组,即( -> (?:
  • 要让np.nan 工作,不要忘记import numpy as np
  • (?s) 是模式内 re.DOTALL 选项。

【讨论】:

  • 谢谢,维克托。你知道为什么我会在我的测试数据集上得到ValueError: Wrong number of items passed 7, placement implies 1 吗?我将在几秒钟内添加代表性数据
  • 你没有使用我的解决方案。使用只有一个捕获组的正则表达式。
  • 好的,我明白了。我认为没有多个捕获组的解决方案?然后我会给你实际的正则表达式。我更新了问题文本。我需要那个正则表达式的.group(5)
  • 我假设你不太明白我为什么建议这种解决方案。 1)Series.str.extract 在 Pandas 中很方便将(部分)匹配提取到新列中,为此,您需要在要提取的部分周围的模式中使用 capturing 组. 2) 您不需要提取到新列中的那些分组应该是非捕获 ((?:...))。 3) 只有“具有single char Alternatives 的捕获组被转换为character classes”。如果你有(\.|,|\s+),你不能使用[.,\s+],它会匹配不同的东西。
  • @id345678 组 0 是匹配值。捕获组从 ID=1 开始。点击顶部左侧的保存正则表达式。然后分享链接。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多