2013-03-17 5 views
0

필자는 참고 문헌과 함께 html 파일을 가져와 저자를 제외한 모든 것을 제거하는 작업을 해왔다. html 태그의 문자와 같은 불필요한 데이터를 제거하는 데 어려움을 겪고 있습니다. 나는 전체 태그를 제거하거나 태그 사이의 특정 데이터를 제거 할 수 있기를 원합니다.펄과 패턴 매칭

오른쪽은 지금 여기처럼 내 서브 모습입니다 : 그것이 무엇을하는 모든 태그 문자를 벗겨이다 지금이 순간

sub extractAuthorsIntoArray{ 
     @author_array = split /[<>"\/?!.=\(\)1234567890':]/, $doc; 
     foreach(@author_array){ 
      print "$_" . "\n"; 
     } 
    } 

하지만 내가 같은 원하지 않는 외부 데이터의 무리 잎 게시 날짜 및 필요하지 않은 기타 데이터를 게시하십시오. 언제든지 "< li>"라고 말하면서 그 문자를 모두 잃어버린 새로운 데이터를 얻을 수 있습니다. 어쨌든, 나는 계속 망치질거야.

Laters.

편집 : 내가 뭘하려는 것은이 같은 것을 가지고있다

:

< 리 값을 = "2"> 아르 템 Chebotko 및 Shiyong 루, < B> "중첩 된 선택 사항 효율적인 가입 SPARQL 중첩 된 선택적 그래프 패턴 평가 "</b>. <> Semantic Web Evolution을위한 프로그레시브 개념 : 응용 및 개발 </i>, Miltiadis Lytras 및 Amit Sheth (정보), ISBN 160566992X, 2010. <br /> <br /> </li> <> Artem Chebotko, Shiyong Lu, Farshad Fotouhi 및 Anthony Aristar, <> "시맨틱 웹을위한 멀티미디어 언어 데이터의 온톨로지 기반 주석"</b>. < ISTN 1599044269, 2006. < br /> < br /> <> i> 시맨틱 웹 기반 정보 시스템 : 최첨단 응용 프로그램 </i>, IGI Global, Amit Sheth 및 Miltiadis Lytras (편집자)/리>이와

그리고 결국 :

아르 템 Chebotko 및 Shiyong 루

+1

HTML 파서를 사용하십시오. – squiguy

+1

샘플 입력 데이터 및 예상 출력? – ysth

답변

1

오히려 ... 특이한 ... split을 사용하는 방법입니다. 일반적으로 구분 기호로 구분 된 여러 데이터 항목을 포함하는 데이터가 있으면 해당 구분 기호로 데이터를 분할하고 개별 항목을 검색 할 때 사용됩니다. 당신이 여기서하려고하는 것이 아니기 때문에 split은 아마도 droid 명령 일 것입니다.

이미 언급했듯이 적절한 HTML 파서가 실제로 올바른 방법 일 수 있지만 교육용으로 정규 표현식을 사용하고자하므로 특별히 알려 드리겠습니다. regexes로 HTML을 파싱하는 것은 위험으로 가득 차 있으며, 이것이 실패 할 가능성이 거의 확실한 경우가 있음을 명심하십시오.

그래서, 말했다 :

#!/usr/bin/env perl  

use strict; 
use warnings; 
use 5.010; 

my $text = q[< li value="2">Artem Chebotko and Shiyong Lu, < b>"Nested Optional Join for Efficient Evaluation of SPARQL Nested Optional Graph Patterns"< /b>. < i>Progressive Concepts for Semantic Web Evolution: Applications and Developments< /i>, Miltiadis Lytras and Amit Sheth (Eds.), Information Science Publishing, ISBN 160566992X, 2010.< br/>< br/>< /li> < li>Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar, < b>"Ontology-Based Annotation of Multimedia Language Data for the Semantic Web"< /b>. < i>Semantic Web-Based Information Systems: State-of-the-Art Applications< /i>, Amit Sheth and Miltiadis Lytras (Eds.), IGI Global, ISBN 1599044269, 2006.< br/>< br/>< /li>]; 

my @list_items = $text =~ m[<\s*li(?:\s+[^>]*)?>(.*?)<\s*/li\s*>]g; 

my @authors; 
for (@list_items) { 
    /([^<]+), </; 
    push @authors, $1; 
} 

say for @authors; 

출력은 :

Artem Chebotko and Shiyong Lu 
Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar 
1

나의 추천 : 정규 표현식을 사용하지 마십시오. 그 대신 HTML::Parser 또는 CPAN에서 사용할 수있는 여러 모듈 중 하나를 사용하십시오.

+0

HTML : Parser를 사용하고 싶지 않습니다. 나는 정규 표현식에 대해 배우려고 노력하고있다. –

+1

@AdamMercer : 원하는 경우 HTML을 구문 분석 할 수있는 코드를 직접 작성할 수는 있지만 정규 표현식에서는 사용하지 마십시오. HTML은 정규 언어가 아니며 정규 표현식이 잘못된 도구입니다. 실생활 HTML를 파싱하는 과정은 실제로 매우 복잡합니다. * 학습을 시작하기에 엄청나게 어려운 곳을 선택했습니다. – Borodin

+0

패턴 일치를 사용하려는 이유는 원하는 데이터가 정확히 어디에 있는지 알기 때문입니다. 원하는 데이터는 < li> 태그 사이에 있으며 거의 ​​항상 쉼표로 끝나며 < b>이옵니다. 그 청크에서 모든 저자를 추출한 다음, 각 저자를 배열의 고유 한 요소에 넣을 수 있기를 원합니다. –

1

문제는 일반적으로 데이터 구조에 대한 확실성 없이는 해결하기 어렵지만 예제를 기반으로 작성자는 항상 데이터의 첫 번째 비 태그 콘텐츠이고 쉼표 (꽤 일반적인 형식)로 끝납니다.

즉, 문제는 두 부분으로 나뉩니다. 즉, 초기 HTML 태그를 제거한 다음 쉼표 다음을 모두 버립니다.

처음에는 HTML 태그가 <으로 시작하고 >으로 끝나고 두 문자 중 하나를 포함 할 수 없기 때문에 HTML 태그를 쉽게 인식 할 수 있습니다. 따라서 :

줄 시작 부분에있는 모든 HTML 태그 (및 공백)가 제거됩니다. (이 경우 /x 플래그와 다른 코딩 스타일을 Perl 모범 사례에서 권장하는대로 사용합니다.이 단계를 단계별로 수행하면 \A은 문자열의 시작 부분과 일치하고 \s*은 공백 문자와 일치하며 코어는 < [^>]+ >입니다.이 태그는 태그의 시작을 찾고 하나 이상의 문자 태그의 끝. 이 번호는 (?: )+으로 묶어서 허용합니다. (. 당신이 일치하는 유지에 대해 걱정하지 않는 경우 캡처를 해제하는 가장 좋은 방법은 이후 내가 대신 ()(?:)을 사용하고 있습니다) 쉼표 모든 것을 제거

나중에 훨씬 쉽습니다 :

$line =~ s{ , .* }{}xms; 

이제는 각 bibiography 항목이 프로그램의 단일 스칼라라고 가정합니다. 그것은 다소 큰 문제를 보게됩니다. 대신 전체 페이지가 포함 된 변수가 있으면 구문 분석해야 할 수 있습니다. 각 항목이 <li> 태그 인 경우 각 <li> 태그의 콘텐츠를 추출한 다음 위와 같이 처리해야합니다.

이 같은 /g 옵션 일을 뭔가리스트 문맥에서, 일치 그렇게하려면

my @entries = ($doc =~ m{ <li (?: \s [^>])? > (.*?) </li> }xmsg); 

좀 더 미묘한 여기. <li 뒤에있는 (?:)? 비트는 선택적으로 공백과 일치하여 > 이외의 문자를 사용하여 해당 태그에 대한 모든 특성을 허용합니다. (.*?) 부분은 태그의 내용을 추출하는 실제 작업을 수행합니다. * 다음에 ?을 적어 둡니다. 이것은 일치를 비 욕심쟁이로 만듭니다. 즉, 문서의 마지막</li> 태그를 모두 일치시키는 대신 첫 번째</li> 태그까지 모두 일치시킵니다. 마지막으로, /g 수정자는이 일치를 가능한 한 많이 반복하고 캡처의 내용을 목록으로 반환한다고 말합니다 (()).

+0

좋아요, 그렇다면 하나의 단일 문자열에서 모든 내용을 처리하고 싶습니다. 그리고 그 문자열을 구문 분석하고 각 배열에서 각 저자 청크로 끝내기를 원합니까? 그게 여전히 정규식으로 가능할까요? –

+0

쉼표가 포함되어있어 "이후에 쉼표에서 모두 제거"단계에서 두 명 이상의 작가 (예 : Artem Chebotko, Shiyong Lu, Farshad Fotouhi 및 Anthony Aristar)가있는 항목이 중단됩니다. 이 시점에서 태그를 계속 가져야 만 첫 번째 태그 앞에있는 쉼표가 무엇인지 확인할 수 있습니다. –

+0

@AdamMercer 예, 응답의 마지막 부분입니다. 문서의 모든 '

  • '쌍의 내용을 구문 분석합니다. – rra

    0
    #!/usr/bin/perl -w 
    
    use strict; 
    read DATA, my $string, -s DATA; 
    my @matches = ($string =~ /<\s+li\s*(?:.*?)>(.+?),\s+<\s+b>/g); 
    print "$_\n\n" foreach (@matches); 
    
    __DATA__ 
    < li value="2">Artem Chebotko and Shiyong Lu, < b>"Nested Optional Join for Efficient Evaluation of SPARQL Nested Optional Graph Patterns"< /b>. < i>Progressive Concepts for Semantic Web Evolution: Applications and Developments< /i>, Miltiadis Lytras and Amit Sheth (Eds.), Information Science Publishing, ISBN 160566992X, 2010.< br/>< br/>< /li> < li>Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar, < b>"Ontology-Based Annotation of Multimedia Language Data for the Semantic Web"< /b>. < i>Semantic Web-Based Information Systems: State-of-the-Art Applications< /i>, Amit Sheth and Miltiadis Lytras (Eds.), IGI Global, ISBN 1599044269, 2006.< br/>< br/>< /li> 
    

    이 특정 문제를 해결하고자하는 경우에, 어떤 당신의 정규식이 찾고해야하는 중입니다 :

    a) < li value="2">AUTHORS, < b> 
    b) < li>AUTHORS, < b> 
    

    a) one possib 르 정규식은 다음과 같습니다

    B의 경우
    < \s+ li \s+ value="2"> (.+), \s+ <\s+b> 
    

    ) 하나의 가능한 정규식은 다음과 같습니다

    < \s+ li> (.+), \s+ <\s+b> 
    

    결합이 두 정규식 등에서 특정 요소를 뽑아 오기의 yeilds :

    <\s+li\s*(?:.*?)>(.+?),\s+<\s+b> 
    

    하지 우아한 & 등하지만 어쩌면 그것은 도움이됩니다 당신.