【问题标题】:Error missing values using .replace(regex)使用 .replace(regex) 错误缺失值
【发布时间】:2021-04-08 17:22:35
【问题描述】:

我正在尝试用数据框中的正则表达式替换一些杂乱的数据,该列具有限定值,但它们很杂乱。例如,我在“包装”一栏中有“塑料”,“塑料”,“塑料包装”,或“卡顿”,“纸箱”,“纸箱”...,但它们的含义相同,即“塑料'或'纸箱'之类的东西。因此,我试图用 .replace 和 Regex 替换所有这些值。我的代码如下所示:

dict1={r'[cK]arton':'Carton',r'\W*((?i)plasti(?-i))\W*':'Plastique',r'[cC]onserve':'Conserve'}

df['packaging'].replace(dict1,inplace=True,regex=True)

但是,当我执行时,它给了我错误:缺少:在位置 18

我已经检查过,第 1 行到第 18 行不仅在第 18 行有 17 个缺失值,那么为什么我会出现这个错误?我应该告诉 python 忽略 na 值吗?但是 replace() 函数似乎没有忽略 na 选项。

非常感谢您

【问题讨论】:

  • 错误不是由于数据框中的nan 值。你的第二个正则表达式模式有点奇怪。 ? 跟在 ( 之后,就像在 (?....) 中一样,其含义与您预期的不同,并且只允许紧跟在 ? 之后的某些字符。我建议重新审视您希望使用包含 plasti 的模式实现的目标。
  • 您可以控制数据的插入方式吗?也许您可以首先防止插入不同的值。

标签: python-3.x regex str-replace


【解决方案1】:

您不能在 Python re 中在正则表达式的非初始位置使用内联修饰符。此外,它不支持(?-i) 表示法(以禁用前面(?i) 的效果)。

相反,您可以使用内联修饰符组(?i:...)

因此,您需要像这样修复正则表达式定义:

dict1={
    r'[cK]arton':'Carton',
    r'\W*(?i:plasti)\W*':'Plastique',
    r'[cC]onserve':'Conserve'
}

或者,r'\W*(?i:plasti)\W*'也可以写成r'(?i)\W*plasti\W*'

【讨论】:

  • 谢谢。我使用了这个正则表达式 r'\W*(?i:plasti)\W*' 但它与 python 中的 'Glass,plastique' 或 'Film en plastique' 不匹配,但是正则表达式测试人员说它匹配 (regex101.com ),逻辑上它应该在 Python 中匹配,请问你知道为什么吗?
  • @Shyan 你期待什么?匹配包含plasti的单词?那么你需要\w,而不是\W,例如r'\w*(?i:plasti)\w*',见this demo
  • 谢谢!如果正则表达式 '\w*\W*\w*\W *(?i:plasti)\w*' 就够了吗?
  • @Shyan 这不在这个问题的范围内,但我怀疑你只需要r'(?i).*plasti.*'
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多