문제

여기에서의 처리합니다.하는 방법이 있는 토큰 문자열에 줄을 기반으로 여러 개의 정규표현식?

한 가지 예:

나는 모든 href 태그에 해당하는 텍스트와 다른 텍스트에 기반한 다른 regex.그래서 나는 3 표현하고 싶으면 토큰 라인 토큰을 추출한 텍스트의 일치하는 모든 식입니다.

나는 실제로 이를 사용하여 코드(혼동하지 않으로 Adobe)를 구현하는 좋은 오래 된 lex.lex 제공 한 방식을 실행함으로써 이를 수행하십시오""작업을 기반으로 표현입니다.할 수 있는 방법 제어 lex 읽어 파일이 너무(구획/라인을 기반으로 읽).

문제는 코드는 실제로 생산하는 C/C++코드를 실제로는 토큰화 작업입니다.나 파일을 감싸는 이 모든 것들입니다.었는지 궁금하면 perl/python 에서 할 수있는 몇 가지 방법으로 동일한 것입니다.그냥 나는 모든 것을 할 내가 좋아 하나의 프로그래밍 언어 자체.

토큰화 같은 것을 하고 싶어의 한 부분으로 내 응용 프로그램이 있습니다.

그 외에도에서는 perl 또는 파이썬은 어떤 언어(기도)하는지요?

나는에 대해 읽어 플라고 ANTLR 기(구문 분석,할 수 있는 곳은 그것에 대해 자세히 알아보).

하지만 그것을 할 수있는 방법에서 자연적으로 python itself?용서 나는 무지이지만,이러한 도구에 사용되는 모든 인기있는 제품/서비스가?

감사합니다.

도움이 되었습니까?

해결책

특히 웹 페이지에서 링크를 구문 분석 한 후에는 Perl의 www :: 기계화 모듈은 매우 우아한 방식으로 당신을 위해 물건을 알아낼 것입니다. 다음은 스택 오버플로의 첫 페이지를 가져오고 모든 링크를 구문 분석하고 텍스트 및 해당 URL을 인쇄하는 샘플 프로그램입니다.

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new;

$mech->get("http://stackoverflow.com/");

$mech->success or die "Oh no! Couldn't fetch stackoverflow.com";

foreach my $link ($mech->links) {
    print "* [",$link->text, "] points to ", $link->url, "\n";
}

메인 루프에서 각각 $link a www :: mechanize :: link 객체이므로 텍스트와 URL을 얻는 데 제한이 없습니다.

모두 제일 좋다,

다른 팁

다음 모듈에 대한 설명서를 참조하십시오 CPAN

html :: treebuilder

html :: table -extract

그리고

구문 분석 :: 재생산

이 모듈을 사용하여 상당히 크고 복잡한 웹 페이지를 처리했습니다.

당신이 정말로 HTML을 구문 분석하고 싶어하는 것 같습니다. 그렇게하기위한 멋진 패키지를 보는 것이 좋습니다.

또는! 다음 중 하나와 같은 파서를 사용할 수 있습니다.

  • pyparsing
  • DPARSER - 좋은 파이썬 바인딩이 좋은 GLR 파서.
  • antlr - 파이썬 코드를 생성 할 수있는 재귀 적 괜찮은 파서 생성기.

이 예는 BeautifulSoup에서 나온 것입니다 선적 서류 비치:

from BeautifulSoup import BeautifulSoup, SoupStrainer
import re

links = SoupStrainer('a')
[tag for tag in BeautifulSoup(doc, parseOnlyThese=links)]
# [<a href="http://www.bob.com/">success</a>, 
#  <a href="http://www.bob.com/plasma">experiments</a>, 
#  <a href="http://www.boogabooga.net/">BoogaBooga</a>]

linksToBob = SoupStrainer('a', href=re.compile('bob.com/'))
[tag for tag in BeautifulSoup(doc, parseOnlyThese=linksToBob)]
# [<a href="http://www.bob.com/">success</a>, 
#  <a href="http://www.bob.com/plasma">experiments</a>]

당신은 보셨습니까? pyparsing?

그들의 홈페이지에서 :

다음은 "안녕하세요, 세계!"을 구문 분석하는 프로그램입니다. (또는 양식의 인사 ",!") :

from pyparsing import Word, alphas
greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
hello = "Hello, World!"
print hello, "->", greet.parseString( hello )

프로그램은 다음을 출력합니다.

Hello, World! -> ['Hello', ',', 'World', '!']

문제가 웹 스크래핑과 관련이있는 문제가 있으면 보는 것이 좋습니다. 웹 :: 스크레이퍼 이는 각각 XPATH를 통해 쉬운 요소 선택을 제공합니다. 나는 (독일어)가있다 웹에서 대화하십시오 :: 스크레이퍼 그러나 Babelfish를 통해 실행하거나 코드 샘플을 보면 구문을 빠르게 개요하는 데 도움이됩니다.

손으로 구분되는 HTML은 번거롭고 미세한 HTML 파서 중 하나를 사용하는 것만으로는 많이주지 않을 것입니다. HTML이 매우 제한된 변형 인 경우 영리한 정규 표현식을 사용하여 얻을 수 있지만 이미 하드 코어 파서 도구를 세우고 있다면 HTML이 구문 분석하는 것보다 훨씬 더 규칙적인 것처럼 들립니다. 정규 표현.

perlop:

한 유용한 관용에 대한 렉스-스캐너 가 /\G.../gc .결합할 수 있습니다 여러 regexps 다음과 같이 처리 문자열 부분 의 부분을 다른 작업에 따라 정규 표현식 일치합니다.각 기능에 맞추려고 노력 는 이전에서 나뭇잎.

 LOOP:
    {
      print(" digits"),       redo LOOP if /\G\d+\b[,.;]?\s*/gc;
      print(" lowercase"),    redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc;
      print(" UPPERCASE"),    redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc;
      print(" Capitalized"),  redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc;
      print(" MiXeD"),        redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc;
      print(" alphanumeric"), redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc;
      print(" line-noise"),   redo LOOP if /\G[^A-Za-z0-9]+/gc;
      print ". That's all!\n";
    }

또한 체크 아웃하십시오 pquery 이런 종류의 일을하는 정말 멋진 페어 방법으로 ....

use pQuery;

pQuery( 'http://www.perl.com' )->find( 'a' )->each( 
    sub {
        my $pQ = pQuery( $_ ); 
        say $pQ->text, ' -> ', $pQ->toHtml;
    }
);

# prints all HTML anchors on www.perl.com
# =>  link text -> anchor HTML

그러나 귀하의 요구 사항이 HTML/웹을 넘어 서면 여기에 "Hello World!"가 있습니다. 예제 구문 분석 :: 재생산...

use strict;
use warnings;
use Parse::RecDescent;

my $grammar = q{
    alpha : /\w+/
    sep   : /,|\s/
    end   : '!'
    greet : alpha sep alpha end { shift @item; return \@item }
};

my $parse = Parse::RecDescent->new( $grammar );
my $hello = "Hello, World!";
print "$hello -> @{ $parse->greet( $hello ) }";

# => Hello, World! -> Hello , World !

아마도이 너트를 깨뜨리기 위해 너무 큰 망치가 너무 많을 것입니다 ;-)

오류 확인을 포함하도록 Bruno의 예제 수정 :

my $input = "...";
while (1) {
    if ($input =~ /\G(\w+)/gc) { print "word: '$1'\n"; next }
    if ($input =~ /\G(\s+)/gc) { print "whitespace: '$1'\n"; next }

    if ($input !~ /\G\z/gc)  { print "tokenizing error at character " . pos($input) . "\n" }
    print "done!\n"; last;
}

(스칼라 // g를 사용하는 것은 불행히도 1 달러 등을 사용하지 않는 곳입니다.) 변수.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top