如何根据Python中的正则表达式规则对字符串进行分类/分类

时间:2012-03-08 19:45:25

标签: python regex data-warehouse etl classification

我正在用Python编写一个ETL脚本,用于获取CSV文件中的数据,验证和清理数据,以及根据某些规则对每一行进行分类或分类,最后将其加载到postgresql数据库中。

数据看起来像这样(简化):

ColA, ColB, Timestamp, Timestamp, Journaltext, AmountA, AmountB

每一行都是金融交易。 我想要做的是根据一些规则对交易进行分类或分类。 规则基本上是与Journaltext列中的文本匹配的正则表达式。

所以我想做的是这样的事情:

transactions = []
for row in rows:
    t = Transaction(category=classify(row.journaltext))
    transactions.append(t)

我不确定如何有效地编写classify()函数。

这就是分类规则的工作原理:

  • 有许多类别(更多可以并且稍后会添加)
  • 每个类别都有一组子字符串或正则表达式,如果事务的Journaltext与此表达式匹配或包含此子字符串,则此事务属于此类别。
  • 交易只能在一个类别
  • 如果某个类别FOO具有子字符串'foo'和'Foo',而另一个类别BAR具有子字符串'football',那么具有Journaltext ='food'的事务必须放在类别FOO中,因为它只匹配FOO ,但是使用Journaltext ='footballs'的交易必须放在BAR类别中。我认为这意味着我必须在每个类别上加上优先权或类似内容。
  • 如果事务与任何表达式都不匹配,则它在类别中为None,或者将放在名为“UNKNOWN”或类似的占位符类别中。这无关紧要。

确定。那么如何在Python中表示这些类别和相应的规则呢?

我非常感谢您的意见。即使你无法提供完整的解决方案。任何暗示我朝着正确方向发展的事情都会很棒。感谢。

2 个答案:

答案 0 :(得分:2)

没有任何额外的毛茸茸:

categories = [
  ('cat1', ['foo']),
  ('cat2', ['football']),
  ('cat3', ['abc', 'aba', 'bca'])
]

def classify(text):
  for category, matches in categories:
    if any(match in text for match in matches):
      return category
  return None

在Python中,您可以使用in运算符来测试字符串的子集。您可以添加一些内容,例如isinstance(match, str),以检查您是使用简单字符串还是正则表达式对象。它取得的进步取决于你。

答案 1 :(得分:2)

伪python中的这个解决方案怎么样:

def classify(journaltext):
    prio_list = ["FOO", "BAR", "UPS", ...] # "..." is a placeholder: you have to give the full list here.
    # dictionary: 
    # - key is the name of the category, must match the name in the above prio_list
    # - value is the regex that identifies the category
    matchers = {"FOO": "the regex for FOO", "BAR": "the regex for BAR", "UPS":"...", ...}
    for category in prio_list:
        if re.match(matchers[category], journaltext):
            return category
    return "UNKOWN" # or you can "return None"

特点:

  • 这有一个prio_list,按降序排列所有类别。
  • 它尝试按列表的顺序进行匹配。
  • 它与 matchers 字典中的正则表达式匹配。所以类别名称可以是任意的。
  • 该函数返回类别的名称
  • 如果没有匹配,那么您将获得占位符类别名称。

您甚至可以从配置文件中读取优先级类别列表和正则表达式,但这仍然是读者的练习......