更多Pythonic用Regex编写函数

时间:2017-01-03 14:12:27

标签: python regex

我有20,000多个法庭文件我想提取特定数据点:日期,文件编号,判决。我正在使用Python和Regex来执行此操作。

判决书有三种语言(德语,法语和意大利语),其中一些语言格式略有不同。我正在尝试为各种数据点开发函数,这些数据点考虑到这些和不同的语言。

我发现我的功能非常笨拙。有没有人有更多的pythonic方式来开发这些功能?

def gericht(doc):
    Gericht = re.findall(
        r"Beschwerde gegen [a-z]+ [A-Z][a-züöä]+ ([^\n\n]*)", doc)
    Gericht1 = re.findall(
       r"Beschwerde nach [A-Za-z]. [0-9]+ [a-z]+. [A-Z]+ [a-z]+ [a-z]+[A-Za-z]+ [a-z]+ [0-9]+. [A-Za-z]+ [0-9]+ ([^\n\n]*)", doc)
    Gericht2 = re.findall(
       r"Revisionsgesuch gegen das Urteil ([^\n\n]*)", doc)
    Gericht3 = re.findall(
       r"Urteil des ([^\n\n]*)", doc)
    Gericht_it = re.findall(
       r"ricorso contro la sentenza emanata il [0-9]+ [a-z]+ [0-9]+ [a-z]+ ([^\n\n]*)", doc)
    Gericht_fr = re.findall(
       r"recours contre l'arrêt ([^\n\n]*)", doc)
    Gericht_fr_1 = re.findall(
       r"recours contre le jugement ([^\n\n]*)", doc)
    Gericht_fr_2 = re.findall(
       r"demande de révision de l'arrêt ([^\n\n]*)", doc)

    try:
       if Gericht != None:
          return Gericht[0]
    except:
          None

    try:
       if Gericht1 != None:
           return Gericht1[0]
    except:
          None

    try:
       if Gericht2 != None:
           return Gericht2[0]
    except:
          None

    try:
       if Gericht3 != None:
           return Gericht3[0]
    except:
       None

    try:
       if Gericht_it != None:
           return Gericht_it[0]
    except:
       None

    try:
       if Gericht_fr != None:
           Gericht_fr = Gericht_fr[0].replace('de la ', '').replace('du ', '')
           return Gericht_fr
    except:
       None

    try:
        if Gericht_fr_1 != None:
            Gericht_fr_1 = Gericht_fr_1[0].replace('de la ', '').replace('du ', '')
            return Gericht_fr_1
    except:
        None

    try:
       if Gericht_fr_2 != None:
           Gericht_fr_2 = Gericht_fr_2[0].replace('de la ', '').replace('du ', '')
           return Gericht_fr_2
    except:
        None

1 个答案:

答案 0 :(得分:0)

re.findall()的结果是从不 None,因此测试此内容的所有if语句都是多余的。然后当你想要第一个结果时使用findall()没有意义。

法语结果中的替换可能会删除太多。例如,'du '替换不只是删除 du 这个词,还会影响 du 结尾

def gericht(doc):
    for pattern, is_french in [
        (r'Beschwerde gegen [a-z]+ [A-Z][a-züöä]+ ([^\n]*)', False),
        (
            r'Beschwerde nach [A-Za-z]. [0-9]+ [a-z]+. [A-Z]+ [a-z]+'
            r' [a-z]+[A-Za-z]+ [a-z]+ [0-9]+. [A-Za-z]+ [0-9]+ ([^\n]*)',
            False
        ),
        (r'Revisionsgesuch gegen das Urteil ([^\n]*)', False),
        (r'Urteil des ([^\n]*)', False),
        (
            r'ricorso contro la sentenza emanata il [0-9]+ [a-z]+ [0-9]+'
            r' [a-z]+ ([^\n]*)',
            False
        ),
        (r"recours contre l'arrêt ([^\n]*)", True),
        (r'recours contre le jugement ([^\n]*)', True),
        (r"demande de révision de l'arrêt ([^\n]*)", True),
    ]:
        match = re.search(pattern, doc)
        if match:
            result = match.group(1)
            if is_french:
                for removable in [' de la ', ' du ']:
                    result = result.replace(removable, ' ')
            return result

    return None