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

2024-04-20 02:12:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

数据如下(简化):

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

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

所以我想做的是:

^{pr2}$

我不知道如何有效地编写classify()函数。在

分类规则如下:

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

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

我非常感谢你的意见。即使你不能提供一个完整的解决方案。只要能给我一个正确的方向就好了。谢谢。在


Tags: 文件csv数据字符串脚本foo表达式规则
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),以检查您使用的是简单字符串还是正则表达式对象。它有多先进取决于你。在

pseudo 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\u列表,它是按降序排列的所有类别。在
  • 它尝试按列表的顺序匹配。在
  • 它与matchers字典中的正则表达式匹配。所以类别名称可以是任意的。在
  • 函数返回类别的名称
  • 如果没有匹配项,则获取占位符类别名称。在

您甚至可以从配置文件中读取优先类别列表和regex,但这是留给读者的练习。。。在

相关问题 更多 >