我有20,000多份法庭文件,我想从其中提取具体的数据:日期,文件编号,判决。我正在使用Python和Regex来执行此操作。
判决采用三种语言(德语、法语和意大利语),其中一些语言的格式略有不同。我正在尝试为各种数据点开发函数,这些数据点考虑到了这一点和不同的语言。
我觉得我的功能很笨拙。有没有人有更多的琵琶方法来开发这些功能?
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发布于 2017-01-03 16:38:17
总是使用4个空格作为缩进;3,4和5。如果你是一个空格外,那么它可以打破你的代码,所以这真的很重要。
您对所有不同的正则表达式都做了大致相同的操作,因此您应该使用循环中的公共代码遍历regexes。但是,我会更改您的公共代码,使其不替换de la或du,并且不需要try-except,因为您可以检查gericht是否真实,因此如果是None或空数组,则不会对其进行索引。采取:
REGEXES = [
r"Beschwerde gegen [a-z]+ [A-Z][a-züöä]+ ([^\n\n]*)",
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]*)",
r"Revisionsgesuch gegen das Urteil ([^\n\n]*)",
r"Urteil des ([^\n\n]*)",
r"ricorso contro la sentenza emanata il [0-9]+ [a-z]+ [0-9]+ [a-z]+ ([^\n\n]*)",
r"recours contre l'arrêt ([^\n\n]*)",
r"recours contre le jugement ([^\n\n]*)",
r"demande de révision de l'arrêt ([^\n\n]*)",
]
def gericht(doc):
for regex in REGEXES:
gericht = re.findall(regex, doc)
if gericht:
return gericht[0]但是,这是不必要地在文档中查找正则表达式的所有项,这不是您想要的。你只想要第一个。要在不编辑正则表达式的情况下做到这一点,您可以使用itertools.chain并使用re.finditer。这能让你:
from itertools import chain
def gericht(doc):
gericht = next(chain.from_iterable(re.finditer(r, doc) for r in REGEXES), None)
if gericht is not None:
return gericht.group(0)您可能会更改这一点,将所有正则表达式与|合并在一起,但这样就不会将第一个正则表达式优先于其他正则表达式。可与以下方面合作:
def gericht(doc):
gericht = next(re.finditer('|'.join(REGEXES), doc), None)
if gericht is not None:
return gericht.group(0)但我对雷克斯不太在行。
https://codereview.stackexchange.com/questions/151579
复制相似问题