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

erv*_*gsb 6 python regex etl classification data-warehouse

我正在用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具有子串'足球',那么具有Journaltext ='food'的交易必须放在类别FOO中,因为它只匹配FOO,但是使用Journaltext ='footballs'的交易必须放在BAR类别中.我认为这意味着我必须在每个类别上加优先权或类似优先权.
  • 如果事务与任何表达式都不匹配,则它在类别中为None,或者将放在名为"UNKNOWN"或类似的占位符类别中.这无关紧要.

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

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

g.d*_*d.c 3

没有任何额外的绒毛:

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
Run Code Online (Sandbox Code Playgroud)

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