我正在对法国的法官任命系统进行一些数据分析,并使用一些代码来进行分析。但是我遇到了一个正则表达式问题。
我的数据是由大量法院和法官任命组成的。
这是一个示例列表:
巴黎上诉法院
关于水罐的布拉布拉:多米尼克·马丁先生,布拉布拉布拉
关于法官:Jeanne Truc女士
巴黎地方法院
关于水罐的布拉布拉:弗朗索瓦·杜邦先生,布拉布拉布拉布拉
关于酒壶:让·杜普伊斯(Jean Dupuis)先生,布拉布拉(Blabla)
壶:玛格丽特·洛雷姆(Marguerite Lorem)女士,blahblahblah
里昂地方法院
关于法官的布拉布拉(Blabla):洛拉娜·伊普苏姆(Lorena Ipsum)女士,布拉布拉
在这些地方,地方法院和上诉法院相互交织。通常,在市上诉法院审理后,来到第一区。
(对于正在阅读此书的法国人,我将“大法官法庭”翻译为“地区法院”,将“法院法庭”翻译为“上诉法院”,如果所有内容都是英文,则更容易理解)
然后,我需要法院的法官名单。
为此,我开始使用优质的ol'python 3做一个正则表达式。首先,感谢先生和太太(这是法语,所以M.和Mme。),我得到了所有评委的名单。然后,遍历此列表中的每个法官,以找出他们被任命的地点。我写了这样的东西:
court = re.findall(r'(District Court of.+?|Appelate Court of.+?)\n.+?'+ judge, appointments, re.S)
这样,“法官”变量就是我正在寻找的当前法官的名字,并且“任命”了我正在重新列出的名单。 Dotall标志处于启用状态,如果您不了解python,请在模式之前忘记'r',这只是有关如何解释后面字符串中的特殊字符的问题。
(我也尝试过使用re.search,但我认为re.findall更适合发现错误)
结果始终是列表中的第一个(例如:巴黎上诉法院)...就好像它是一个贪婪的请求一样工作,即使我在每个quatifier中都标记了“?”在python中将量词识别为非贪婪。
(我是一名法律系学生,而不是CS系学生,如果我在这里做错了什么事,我恳求宽恕)。
注意:我正在解析原始列表:http://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000022472292(注意,这是一个丑陋的法国政府网站)。
最佳答案
当前正则表达式的问题在于,即使使用惰性量词,匹配也会在正则表达式允许的字符串中尽早出现。例如,re.search('A+?B', 'AAB')
会匹配整个字符串'AAB',不会继续移动到第二个'A',因此它匹配的越少越好。
因此,基本上,您会获得法院的名称,然后搜索字符串,直到找到首次出现的法官姓名,即使这意味着您正在进入新的法院部分。这是防止这种情况的两个不错的选择:
首先在每个新法院分割appointments
,然后分别在每个法院搜索法官姓名。
要么...
在正则表达式中添加负前瞻,这样如果在法官姓名之前到达新的法院名称,它将失败。
这是一个前瞻性为负的示例:
appointments = """\
COURT A
...
COURT B
...
COURT C
Judge Judy"""
>>> re.findall(r'^COURT[^\n]+(?:.(?!^COURT))+Judge Judy', appointments, re.S | re.M)
['COURT C\nJudge Judy']
您当前的代码将类似于以下内容:
>>> re.findall(r'COURT.+?\n.+?Judge Judy', appointments, re.S)
['COURT A\n...\nCOURT B\n...\nCOURT C\nJudge Judy']