【问题标题】:A regular expression to exclude a word and specific characters [closed]排除单词和特定字符的正则表达式[关闭]
【发布时间】:2021-11-16 08:24:18
【问题描述】:

我需要使用正则表达式和 python 从数据集中的字符串中过滤掉特定字符。

我有包含业务和员工信息的数据。我想保留员工人数,并跳过/排除任何包含“自雇人士”一词的单元格我可以使用什么正则表达式来删除除所述字符之外的所有内容。
示例:
String: "Health, Wellness and Fitness, 501-1000 employees"
Desired Outcome: 501-1000

或者:
String: "Retail, 10,000+ employees"
Desired Outcome: 10,000+"

或者,如果单元格包含“自雇”,则应跳过该词,将其保留并转到下一个单元格:
String: Self-employed'
Desired Outcome: Self-employed"

我想要一种模式,它可以消除除期望结果中所要求的之外的所有内容。 这是我使用的代码,但它似乎没有改变任何东西,我做错了什么?

if 'employee' in row.keys():
        row['employee'] = re.sub("([0-9]+[,\-]*[0-9]*[+]?|Self-employed)", '', str(row['employee']))

【问题讨论】:

  • 我把它放在一起只是摆弄你的用例([0-9]+[,\-]*[0-9]*[+]?|Self-employed)。它适用于您提供的每种情况。如果这符合您的需求,我会提供答案。
  • 您的模式以数字开头,后跟几个非空格:\d[^\s]*
  • @Porsche9II 这很聪明! Self-employed 的情况仍然需要处理,但这很容易。
  • 我认为您错误地使用了re.sub。您的替换字符串为空。您想用捕获组结果替换整个字符串。
  • 我认为您想要的不是re.sub,因为从技术上讲,您想要匹配的值并且您不想替换它们。你可能会做一个更复杂的正则表达式,或者只是使用类似row['employee'] = re.search("([0-9]+[,\-]*[0-9]*[+]?|Self-employed)", str(row['employee'])).group(1)

标签: python regex csv data-cleaning


【解决方案1】:

re.sub 匹配正则表达式模式并替换匹配项。你不想那样做。您想要相反的 - 匹配模式并使用匹配。所以re.sub 在这里似乎不是正确的方法。您可以改为使用re.search 来查找与您的正则表达式匹配的组,然后将结果分配给您的row['employee'] 变量。这是一个基于您目前提供的代码的示例。:

if 'employee' in row.keys():
    match = re.search("(\d[^\s]*|Self-employed)", str(row['employee']))
    if match:
        row['employee'] = match.group()

感谢 Porsche9II 的正则表达式优化。

【讨论】:

  • 我在尝试运行它时似乎收到了此错误消息。 "AttributeError: 're.Match' 对象没有属性 'match'"
  • 已更新代码,请重试
  • 它似乎可以正常工作,但是现在某些单元格中的单元格中包含位于单元格右侧居中的日期,例如“10-Jan”,您是否知道为什么会发生这种情况?
  • 我知道为什么会发生这种情况,但您需要使用有问题行的一些示例数据来更新您的问题,否则我无法可靠地重现
  • 一月从哪里来?
猜你喜欢
  • 2021-04-20
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多