2011-08-14 17 views
6

Jak zaprojektować wyrażenie regularne, aby uchwycić cytat prawny? Tutaj jest akapit, który pokazuje dwie typowe cytaty prawne:Wyrażenie regularne do cytowania legalnego

Mamy nalegał na ścisłą kontrolą w każdym kontekście, nawet dla tak zwanych „łagodnych” klasyfikacji rasowych, takich jak rasa świadomych uniwersyteckich przyjęć polityk, patrz Grutter v. Bollinger, 539 US 306, 326 (2003), preferencje rasowe w umowach rządowych, patrz: Adarand, supra, w 226, i dystrykt oparty na rasie, mający na celu poprawę reprezentacji mniejszości , patrz Shaw v. Reno 509 US 630 650 (1993).

Cytat będzie poprzedzony przecinkiem i białymi literami, kropką i białymi znakami lub "sygnałem", np. "Zobacz" lub "zobacz np." I białymi znakami. Mam problem z ustaleniem, jak dokładnie określić początek cytowania.

Jestem zaznajomiony z wyrażeń regularnych Perla, ale rozumiem również przykłady z innych języków.

+0

http://pyparsing.wikispaces.com/message/view/home/10397114 – miku

+0

Jaki język? Różne języki mają różne smaki regex. –

+2

Witamy w przepełnieniu stosu. Popraw swoje pytanie, publikując kod [odpowiednio sformatowany] (http://stackoverflow.com/editing-help), który zastosowałeś do problemu, wszystkie ** odpowiednie ** komunikaty o błędach dokładnie w takiej formie, w jakiej się pojawiają, i niezależnie od próbek "Testowanie przeciwko. Należy również dołączyć odpowiednio sformatowaną próbkę ** oczekiwanego wyniku **, aby ludzie zrozumieli wyniki, które próbujesz osiągnąć. –

Odpowiedz

2

Cóż, na początku możesz użyć następujących opcji. Będziesz potrzebował więcej wzorów do innych startów.

/(,)|(see)/ 

Koniec okaże się większym problemem. Na przykład w "patrz Adarand, powyżej, na 226, i wyścigu ..." nie ma wyraźnego wskaźnika końca. Podejrzewam, że czyste wyrażenia regularne nie wystarczą do tego zadania, potrzebujesz wyższej formy analizy języka. Lub zadowala się dopasowywaniem tylko podzbioru wszystkich cytowań lub dopasowywaniem zbyt wiele razy.

3

W swoim przykładzie poprzedza się cytowania tym, co BlueBook uznał za "sygnał" (Zasada 1.2 na stronie 54 wydania dziewiętnastego). Inne sygnały obejmują, ale nie są ograniczone do: na przykład, również, porównaj, porównaj, i, z, przeciw, i, ale. Można je łączyć w zaskakujący i nieoczekiwany sposób. . . Zobacz także, np. Watts przeciwko Stanom Zjednoczonym, 394 U.S. 705 (1969) (za curiam). Oczywiście, istnieje również cytaty, które nie są poprzedzone sygnałów

Wtedy Warto również obsłużyć przypadków cytaty z nieoczekiwanymi nazw przypadków.

See przeciwko Seattle, 387 US 541 (1967)

Inni zaatakowali ten konkretny problem, najpierw identyfikując referencję reportera (np. 387 US 541) z wyrażeniem regularnym, takim jak (\ d +) \ s (. +?) \ S (\ d +), a następnie próbując rozszerzyć zakres stamtąd . Cytowania przypadków mogą być dowolnie złożone, więc ta ścieżka nie jest pozbawiona własnych pułapek. referencje reportera może mieć także kilka ciekawych form, jak na zasadach Bluebook.

Jones v Smith, _ _ F.3d (2011)

W przypadku decyzji, które nie zostały jeszcze opublikowane na przykład. Oczywiście, autorzy będą używać odmian powyższych, w tym (ale nie wyłącznie) --- F.3d ---

3

To na pewno nie jest idealne, ale bez więcej przykładów do przetestowania przeciwko temu jest najlepsze, co mogę myśleć z. Dzięki @Paul H. za dodatkowe słowa sygnałowe do dodania.

#!/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"; 
} 

wyjściowa wynosi:

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) 
0

Napisałem wzorzec (stworzony dla JavaScript, ponieważ nie określiłeś języka), który może być użyty do dopasowania dwóch cit Podane informacje:

var regex = /(\w+\sv.\s\w+,\s\d*\s?[\w.]*[\d,\s]*\(\d{4}\))/ig; 

Można go zobaczyć w akcji here.

To będzie pasował do innych, tak długo jak oni śledzić ten sam format:

Name v. Name, 999 A.A.A... 999, 999 (1999) 

Chociaż obecność niektórych częściach jest opcjonalne. Podaj więcej informacji na temat cytatów, które mogą nie pasować do tego wzorca, jeśli nie spełnia Twoich oczekiwań.

0

W przypadku tego rodzaju potencjalnie skomplikowanych wyrażeń regularnych dzielę je na proste elementy, które można indywidualnie testować i ewoluować.

Używam REL, DSL (w Scala), który pozwala ponownie złożyć i ponownie użyć fragmentów regex. W ten sposób można zdefiniować regex tak:

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)" 

Następnie przetestować każdy bit tak:

"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 
    } 
} 

Również Twoje testy jednostkowe/Spec może pełnić swojej doc do tego kawałka regex, wskazanie, co jest dopasowane, a co nie (co zazwyczaj ma znaczenie w przypadku wyrażeń regularnych).

Zrobiłem gist for this example z pierwszą naiwną implementacją.

W nadchodzącej wersji REL (0.3), będziesz mógł bezpośrednio eksportować Regex w, powiedzmy, smaku PCRE, aby używać go niezależnie ... Na razie zaimplementowane są tylko tłumaczenia JavaScript i .NET, więc możesz po prostu uruchomić próbka używająca SBT i wyprowadza regex o aromacie Java (choć całkiem prosty, myślę, że może być skopiowany/wklejony do Perla).

0

Nie jestem zbyt obeznany z Perl, ale gdybym chciał to zrobić, użyłbym pewnych wyszukiwań w Internecie. Najpierw znajdę dobry zestaw wzorców.

Poszedłem z tym regex:

(\d{3})\sU\.S\.\s(\d{3}) 

Podział regex:

  1. (\ d {3}) -> Wygląda na 3 numery, umieszcza je w $ 1
  2. \ sU.S. \ s -> szuka białych znaków, a następnie USnastępnie przez inną spacją
  3. (\ d {3}) -> Wygląda na 3 numery ponownie, umieszczając je na $ 2

co to robi, to wygląda na wzór 539 U.S. 306 i umieszcza je przechwytuje grup. To stawia następujące wartości do zmiennych:

$1 = 539 
$2 = 306 

I pętla będzie przez i znaleźć każde wystąpienie wzorca, to chciałbym użyć czegoś chwycić tej witryny z sieci:

http://supreme.justia.com/cases/federal/us/$1/$2/case.html 

Które w ta sprawa stałaby się:

http://supreme.justia.com/cases/federal/us/539/306/case.html 

Kiedyś miałem ten, mogę przejść przez drzewo na miejscu następujące (kładę całe drzewo tutaj, ponieważ w zależności od języka tak jak ty to może b e zmienione):

<body>  
    <div id="main">  
     <div id="container">  
     <div id="maincontent">  
      <h1> HERE IS THE TITLE OF THE CASE </h1> 

XPath tego jest //*[@id="maincontent"]/h1.

Stąd masz teraz pełne odniesienie:

Grutter v. Bollinger - 539 U.S. 306 (2003) 

nie jestem ekspertem prawnym, więc nie wiem, czy istnieją inne sposoby mogą być deklarowane (jeden z pozostałych odpowiedzi wspomniano coś w rodzaju F.3d), aby uchwycić to inne podejście. Jeśli dostanę trochę czasu później, mogę napisać to w PowerShellu, żeby zobaczyć, jak bym to zrobił.