您如何设计正则表达式来捕获法律引文?这是一个段落,显示了两个典型的法律引用:
我们坚持严格审查每一个环境,即使是 所谓的“良性”种族分类,如种族意识 大学招生政策,见Grutter诉Bollinger,539 U.S. 306,326(2003),政府合同中基于种族的偏好,见 Adarand,同上,在226,以及基于种族的限制旨在改善 少数民族代表,参见Shaw诉Reno,509 U.S. 630,650(1993)。
引用前面会有一个逗号和空格,一个句点和一个空格,或一个“信号”,如“看”或“看,例如”和空格。我无法弄清楚如何准确指定引文的开头。
我最熟悉Perl正则表达式,但也能理解其他语言的例子。
答案 0 :(得分:3)
在您的示例中,您已经引用了BlueBook认为“信号”的内容(第19版第54页的规则1.2)。其他信号包括但不限于:例如,一致,也可以,参见,比较,和,一致,反对,但是。这些可以以令人惊讶和意想不到的方式组合。 。 。另见,例如, Watts v.United States,394 U.S. 705(1969)(per curiam)。当然,也有引用没有信号
然后,您还需要处理具有意外案例名称的案例引用:
参见诉西雅图,387 U.S. 541(1967)
其他人通过首先用(\ d +)\ s(。+?)\ s(\ d +)这样的正则表达式识别报告参考(即387 US 541)然后尝试扩大范围来攻击这一特定问题从那里。案例引用可以是任意复杂的,因此这条道路并非没有自己的陷阱。根据BlueBook规则,记者引用也可以采用一些有趣的形式:
Jones v.Smith, _ F.3d _ (2011)
对于尚未发布的决策。当然,作者将使用上述变体,包括(但不限于)--- F.3d ---
答案 1 :(得分:2)
这当然不是完美的,但没有更多的例子来测试它是我能想到的最好的。感谢@Paul H.添加额外的信号词。
#!/usr/bin/perl
$search_text = <<EOD;
"We have insisted on strict scrutiny in every context, even for so-called “benign” racial classifications, such as race-conscious university admissions policies, see Grutter v. Bollinger, 539 U.S. 306, 326 (2003), race-based preferences in government contracts, see Adarand, supra, at 226, and race-based districting intended to improve minority representation, see Shaw v. Reno, 509 U.S. 630, 650 (1993)."
In your example, you've preceded the citations with what the BlueBook deems a 'signal' (Rule 1.2 on page 54 of the nineteenth edition). Other signals include but are not limited to : e.g., accord, also, cf., compare, and, with, contra, and but. These can be combined in surprising and unexpected ways . . . See also, e.g. Watts v. United States, 394 U.S. 705 (1969) (per curiam). Of course, there are also citations that are not preceded by signals
Then you'll also want to handle case citations with unexpected case names :
See v. Seattle, 387 U.S. 541 (1967)
Others have attacked this particular problem by first identifying the reporter reference (i.e. 387 U.S. 541) with a regular expression like (\d+)\s(.+?)\s(\d+) and then trying to expand the range from there. Case citations can be arbitrarily complex so this path is not without its own pitfalls. Reporter references can also take on some interesting forms as per BlueBook rules:
EOD
while ($search_text =~ m/(\, |\. |\; )?(see(\,|\.|\;)? |e\.g\.(\,|\.|\;)? |accord(\,|\.|\;)? |also(\,|\.|\;)? |cf\.(\,|\.|\;)? |compare(\,|\.|\;)? |with(\,|\.|\;)? |contra(\,|\.|\;)? |but(\,|\.|\;)? )+(.{0,100}\d+ \(\d{4}\))/g) {
print "$12\n";
}
while ($search_text =~ m/[\n\t]+(.{0,100}\d+ \(\d{4}\))/ig) {
print "$1\n";
}
输出是:
Grutter v. Bollinger, 539 U.S. 306, 326 (2003)
Shaw v. Reno, 509 U.S. 630, 650 (1993)
Watts v. United States, 394 U.S. 705 (1969)
See v. Seattle, 387 U.S. 541 (1967)
答案 2 :(得分:1)
你可以在开始时使用以下内容。其他开始时你需要更多模式。
/(, )|(see )/
结局将证明是更大的问题。例如,在“参见Adarand,同上,在226,以及基于种族的......”中,没有明确的结束指标。我怀疑纯正则表达式不足以完成这项任务,你需要更高级的语言分析。或者满足于仅匹配所有引用的子集,或者有时匹配太多。
答案 3 :(得分:0)
我正在使用http://gskinner.com/RegExr/来测试此语法
(?<=see )\w+ v. \w+, \d{3} U\.S\. \d{3}, \d{3} \(\d{4}\)
正如你所看到的,我正在使用'积极的外观'
答案 4 :(得分:0)
我写了一个模式(因为你没有指定语言而为JavaScript创建),可以用来匹配你提到的两个引用:
var regex = /(\w+\sv.\s\w+,\s\d*\s?[\w.]*[\d,\s]*\(\d{4}\))/ig;
您可以在行动here中看到它。
只要符合相同的格式,它就会与其他人匹配:
Name v. Name, 999 A.A.A... 999, 999 (1999)
虽然某些部件的存在是可选的。如果不符合您的需求,请提供有关可能不符合此模式的引用的更多信息。
答案 5 :(得分:0)
对于这种潜在的复杂正则表达式,我倾向于将其分解为可以单独进行单元测试和演化的简单部分。
我使用REL,一个DSL(在Scala中),允许您重新组装和重用正则表达式。这样,您可以像这样定义正则表达式:
val NAME = α+
val VS = """v\.?""" ~ """s\.?""".?
val CASE = NAME("name1") ~ " " ~ VS ~ " " ~ NAME("name2")
val NUM = ß ~ (δ+) ~ ß
val US = """U\.? ?S\.? """
val YEAR = ( ("1[7-9]" | "20") ~ δ{2} )("year")
val REF = CASE ~ ", " ~ // "Doe v. Smith, "
(NUM ~ " ").? ~ // "123 " (optional)
US ~ NUM ~ // "U.S. 456"
(", " ~ NUM).* ~ // ", 678" 0 to N times
" \\(" ~ YEAR ~ "\\)" // "(1999)"
然后像这样测试每一点:
"NUM" should {
"Match 1+ digits" in {
"1" must be matching(NUM)
"12" must be matching(NUM)
"123" must be matching(NUM)
"1234" must be matching(NUM)
"12345" must be matching(NUM)
"123456" must be matching(NUM)
}
"Match only standalone digits" in {
NUM.findFirstIn(" 123 ") must beSome("123")
NUM.findFirstIn(" n123 ") must beNone
}
}
此外,您的单位/规格测试可以加倍作为此正则表达式的文档,指示匹配的内容和不匹配的内容(这对于正则表达式来说很重要)。
我做了gist for this example第一个天真的实现。
在即将发布的版本的REL(0.3)中,您可以直接导出正则表达式,例如PCRE风格,以便独立使用...现在只实现了JavaScript和.NET的翻译,所以你可以运行使用SBT的示例,它将输出一个Java风格的正则表达式(虽然非常简单,我认为它可以复制/粘贴到Perl)。
答案 6 :(得分:0)
我对perl并不过分熟悉,但如果我想这样做,我会使用一些网页查找。首先,我会找到一套很好的模式。
我选择了这个正则表达式:
(\d{3})\sU\.S\.\s(\d{3})
正则表达式的细分:
这样做,查找模式539 U.S. 306
并将它们放入捕获组。这会将以下值放入变量中:
$1 = 539
$2 = 306
我会循环,找到模式的每个实例,然后我会用一些东西从网上抓取这个网站:
http://supreme.justia.com/cases/federal/us/$1/$2/case.html
在这种情况下会变成:
http://supreme.justia.com/cases/federal/us/539/306/case.html
有了这个,我可以通过站点树来查看以下内容(我将整棵树放在这里,因为根据语言的不同,你可能会改变这种方式):
<body>
<div id="main">
<div id="container">
<div id="maincontent">
<h1> HERE IS THE TITLE OF THE CASE </h1>
此xpath是//*[@id="maincontent"]/h1
。
从这里你现在有完整的参考:
Grutter v. Bollinger - 539 U.S. 306 (2003)
我不是法律专家,因此我不知道是否还有其他方式可以被宣布(其中一个答案提到类似F.3d
),那么需要另一种方法来捕获。如果我以后再过一段时间,我可能会在PowerShell中写出来,看看我会怎么做。
答案 7 :(得分:0)
我管理CourtListener.com项目,该项目从意见中提取数百万次引用。当前的任务是艰巨的。我不会依赖“ see”和“ also”之类的信号。
相反,我们要做的是创建一个JSON对象,其中包含所有可能的报告者缩写(大约1万行),并将其存储在我们的报告者数据库存储库中:
https://pypi.org/project/reporters-db/1.0.12/
那是在Python中,但是JSON对象也在源存储库中(如果您也喜欢的话,还有一个CSV)。
使用JSON对象,我们建立了一个正则表达式,该表达式知道所有报告者的缩写是什么。
在您的示例中,该数字为U.S.
,但我们还有数百种(包括拼写错误和错别字),而正则表达式本质上是:
\d{1,3} (REPORTER|REPORTER2|REPORTER3|...) \d{1,3}
这变得复杂,因为某些页码使用罗马数字只是为了弄乱您,并且还有六分之一的其他特殊情况需要考虑。
所以...如果您想做得好,您会问一个非常大的问题。好消息是,除了reporters-db Python项目和JSON对象之外,我们还开放了我们的引文查找器。不幸的是,这不是一个独立项目,但是您可以看到它的工作原理并将其用作起点:
https://github.com/freelawproject/courtlistener
在cl/citations
中查找相关代码。
我希望这会有所帮助!我们是致力于解决这类问题的非营利组织,因此,如果您有任何问题或想法,请一定与我们联系。