我如何用正则表达式找到“Judge Randolph M. Hammock”?

2024-05-14 06:33:08 发布

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

我想抓住一个法官的名字,这个名字周围有一堆文字。你知道吗

以下是一些示例文本:

® @ Stperio,l LED
>
Cay
OCT 9, "se"
-aeentative Ruling Sherr p 8 29
by C. 17
% Exeo, ive On Z—
Judge Randolph M. Hammock, Department 47 Fie oH/erp
a, Copy,
HEARING DATE: October 18, 2017 TRIAL DATE: March 27, 20 18
. CASE: Roger Lee Harrison v. Taylor Hackford, et al. ©
CASE NO.: BC596850

文本文件将始终显示“Judge FirstName LastName”。你知道吗

这是我尝试的代码:

def get_judge_name(judge_file_name):
    j = open("{}{}".format(PATH, judge_file_name), "r")
    judge_contents = j.read()
    j.close()
    judge = re.search('Judge (.*?)([A-Z]{2,})', judge_contents)
    print(judge)

我期望输出Judge Randolph M. Hammock,但得到了None。你知道吗


Tags: name文本示例datecontents名字filecase
2条回答

What if there is no "," after the judge? Is there a regular expression to capture the entire name?

了解问题

这完全取决于法官名字的多样性和格式。如果法官的名字和之后的文本在语义上没有区别,那么根据任务的性质,任何解决方案都会对它捕获多少文本过于宽松或过于严格(除非你训练了一个机器学习算法来识别你正在使用的数据集中名字的属性,除非您的程序需要快速准确地抓取法官姓名的大型数据集,否则这几乎肯定是不值得的;法官姓名数据库可能是最实用的解决方案,但需要维护)。你知道吗

这项任务有一个好处:我们知道名字总是以“Judge”开头。这也意味着我们必须小心,永远不要丢弃以“Judge”开头的文本。你知道吗

可能的正则表达式解决方案

Wiktor Stribiżew的解是一个合理的近似值:

Judge(?: +[A-Z][^\W\d_]*\.?)+

它还有一个很好的效果,即允许更多不同的Unicode字母带有[^\W\d_],而我的以ASCII为中心的方法应该是[A-Za-z](注意,有些名称仍然没有说明以大写ASCII字母以外的字母开头的名称,尽管这种情况可能不太常见。)建议使用stopwords扩展也有潜力。你知道吗

但是,它有一个主要缺陷:如果包含单词“Judge”的文本后面没有符合条件的单词,它将丢弃该文本。我会修改它,使用*量词而不是+量词:

^{}

另外,我会对stopwords采取不同的方法,并假设法官的名字不会包含stopword,而不是在法官的名字后面搜索stopword。这样做效率更高,但如果法官的名字恰好是一个停止词,那么也会忽略其中的一部分:

^{}

外卖

最后,除非源文档遵循标准格式,否则这都是近似值。这就是为什么标准化的格式常常使程序员的工作更容易。你知道吗

勘误表

如果Python的内置re模块支持它,我会将空间字符的+量词更改为possessive++以提高效率。第三方^{}模块可以处理更复杂的regex模式。你知道吗

import re
# st is your string
>>> m = re.search(r"Judge ([^,]*)", st)
>>> m.group(0)
'Judge Randolph M. Hammock'
>>> m.group(1)
'Randolph M. Hammock'

我不知道你想要哪一个,但这可能行得通

相关问题 更多 >