用Regex编写函数更容易

2024-04-16 15:24:16 发布

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

我有两万多份法庭文件,我想从中提取具体的数据点:日期,文件编号,判决。我使用Python和Regex来执行这个操作。你知道吗

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

我发现我的功能很笨拙。有没有人能用一种更像Python的方法来开发这些功能?你知道吗

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

Tags: renonedocreturnifdefrla
1条回答
网友
1楼 · 发布于 2024-04-16 15:24:16

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

相关问题 更多 >