2017-01-03 36 views
0

我有20'000+个法庭文档我想从中提取特定数据点:日期,文档编号,判决书。我正在使用Python和Regex来执行此操作。更多Pythonic用正则表达式编写函数

判决书有三种语言(德语,法语和意大利语),其中一些格式稍有不同。我正在尝试开发各种数据点的功能,这些数据点将这些以及不同的语言加以考虑。

我发现我的功能非常笨拙。有没有人得到更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 
+0

什么是正则表达式的预期输入,你提到一个文档,你可以举一个例子文件 – depperm

+5

如果这是**工作代码**,你认为可以改进,考虑[codereview.se。但请注意,您可以将各种'Gericht'列入列表中,并对其进行迭代。另外'试试:'除了'bare:'外''是一个反模式(http://blog.codekills.net/2011/09/29/the-evils-of--except--/),并且'pass '比随便选择'无'更好。 – jonrsharpe

+0

这里有一些[示例文件](https://www.dropbox.com/sh/17t0lvyii89pbay/AADLO1y6bwg0ZRoRGK3aPPnoa?dl=0)有帮助吗? – BarJacks

回答

0

re.findall()结果是从未None,让所有那些if语句测试这都是多余的。然后使用findall()当你只是想第一个结果没有意义。

在法国结果中的替换可能会删除太多。例如,'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