2012-06-19 2 views
2

html 파일에서 문자열 부분을 분리해야합니다. 성공할 수 있다고 생각했지만 데이터 구조는 정말로 혼란 스럽습니다. 나는 매우 초보자이므로 정규 표현은 아마도 나쁜 생각 일 것입니다. 나는 쉼표 또는 세미콜론이 일관성이없고 구분 기호로 선택할 수 없다고 덧붙일 수 있습니다. 여기 어쨌든 내가 한 일을 예로 들어서 시작하겠습니다. 구분 기호가 일치한다면 그 변수구분 기호 목록에 루프를 코딩 하시겠습니까?

예 = D1 D2를 몇 가지 물건 몇 가지 물건 몇 가지 물건의 D3의 D4 D5의 몇 가지 물건을 넣어 HTML입니다 가정

, 그 관심 "물건"을 복구 할 수 다음 스크립트 나 :

for url in open("url-repository.csv", "rt").readlines(): 
    variable1 = urllib2.urlopen(url[:-1]).read() 
    a = re.compile('d1(.*?)\"d2') 
    b = a.search(vqriable1) 
    if b: 
     c = b.group(1) 
     list_of_d1.append(c) 

그러나 구분 기호는 항상 내가 분석 할 수있는 다른 페이지에 같은 않으며, 항상 같은 순서로하지 않습니다.

예 2 = D2 몇 가지 물건의 D3 아무것도 D4 그러므로 나는 당신에게 두 가지를 물어 보곤

몇 가지 물건의 D5.

Delimiters_list = [d1, d2, d3] 

1

스크립트가 예를 들어, 모든 가능한 구성을 보이는 것을 확인하는 것이 가능, 나는 HTML 페이지에있는 모든 구분 기호의 목록을 작성한다고 가정 D1 + D2, D2 + D6, DN + 네?

2 또는 적어도 첫 번째 용어를 나타내며 스크립트가 만난 목록의 첫 번째 용어에 대한 체인 선택을 중지하게 하시겠습니까?

이것은 매우 어려운 문제입니다. 나는 분명하지 않을 수도 있다는 것을 알고 있습니다.하지만 그것을 조사하고 도우려는 사람들에게 미리 감사드립니다.

+3

csv 파일을 여는 중이므로 csv 모듈을 사용해야합니다. –

+0

답변 해 주셔서 감사합니다. 전체 코드를 게시하지 않았으며 CSV 라이브러리 가져 오기를 참조합니까? 또는이 경우에 적합한 CSV 라이브러리의 일부로? – user1466622

+0

@ user1466622 - 일부 (시도한) 파이썬 코드로 내 대답을 업데이트했습니다. –

답변

0

대체 연산자 인 |을 사용하면 문제가 발생하지 않습니다.

(d1|d2|d3|d4|d25)(.*?)(?=d1|d2|d3|d4|d25) 

이 방법 ,

  1. 당신이 경우에 시작 구분 기호를 사로 잡을 것입니다 당신이 1 군에, 그것을 필요로;
  2. 그룹 2에서 "탐욕스럽게"어떤 것을 잡을 것입니다;
  3. 을 사용하고 lookahead 어설 션을 사용하면 나머지 구획을 동일한 정규식과 계속 일치시킬 수 있도록 다음 구분 기호를 "먹어"버릴 수 없습니다.

이 정규식의 데모를 보려면 http://rubular.com/r/DJVegfD3Ul을 참조하십시오.

참고 : 슬프게도 파이썬을 모르므로 코드를 작성하지 않겠습니다. 그러나 모든 구획 문자를 위의 형식으로 결합하는 것은 쉬운 일이 아니어야합니다. 아래 주석에주의하십시오.

UPDATE

이 파이썬을 쓰는 내 처음으로, 지금까지, 그래서 내 실수를 용서합니다.

# start with an array of delimeters 
    delimeters = [d1, d2, d3] 

    # start with a blank string 
    regex_delim = '' 

    # build the "delimiters regex" using alternation 
    for delimeter in delimeters: 
     regex_delim += re.escape(delimeter) + '|' 

    # remove the extra '|' at the end 
    regex_delim = regex_delim[:-1] 

    # compile the regex 
    regex_obj = re.compile('(' + regex_delim + ')(.*?)(?=' + regex_delim + ')') 

    # and that should be it! 
    for match in regex_obj.finditer(html_str): 
     print match.group(2) 

구분 기호에 특수 문자가있는 경우에는 re.escape(delimiter)이 필요합니다. 예를 들어 구분 기호가 * 인 경우 re.escape(...)\*을 반환하므로 구분 기호가 정규식 한정 기호로 변환되지 않습니다.

+0

아, 그리고 실제 구분 기호는 가능성이 정규식에있는 것들을 의미하는 특수 문자가 포함됩니다. 이 문제를 해결하려면 각 분리 문자를 "|"로 결합하기 전에 각 분리 문자를 이스케이프 처리하십시오. http://stackoverflow.com/questions/9608347/how-to-use-q-and-e-regex-symbols-in-python . –

+0

안녕하세요 이것은 꼭해야 할 일입니다. 너무 나쁘면 Python에 직접 존재하지 않습니다. 어쨌든 고마워, 초보자를위한 커브가 힘들 것입니다;) 두 번째 요점은 내가 제대로 이해하는지 모르겠지만, 내가 생각했던 것 : 각 구분 기호를 특수 문자로 바꾸십시오. 문제는 내용이 항상 같은 장소에있는 것은 아니라는 것입니다. 예를 들어 한 케이스에서는 "date"앞에 "owner"가 있었지만 다음 페이지에서는 그 반대입니다. – user1466622

+0

@ user1466622 - 흠, 아마도 나는 오해하고 있습니다. 아마도 당신은 오해하고 있습니다. 파이썬 정규식은''''''을 지원하므로 여러분은 내가 제안한 것을 완벽하게 구현할 수 있습니다! 의사 코드로이 답변을 업데이트하려면 몇 분만 기다려주십시오 ... 두 번째 요점도 명확해질 것입니다. –

0

다음 Python 예제를 통해 문제를 해결할 수 있습니다.

dels = [d1, d2, d3] 
combs = [] 
for d1 in dels: 
    for d2 in dels: 
     combs.append(re.compile(d1 + '(.*?)\"' + d2) 
for comb in combs: 
    check_for_matches(comb, string) 

도움이 되셨기를 바랍니다.

+0

빠른 답변 감사드립니다. 지금 내 전체 코드에 액세스 할 수 없지만 최대한 빨리 테스트 할 것입니다. 나는 전문가가되기에 아주 멀고, 나 자신에게 묻는다 : 그것은 d1과 d2 사이에 d3이 나타나는 경우를 막는가? – user1466622

+0

질문은이 사건에 대해 무엇을하고 싶은가요? d1 (. * d3. *) d2 또는 d1 (. *) d3 및 d2 (. *) d1을 잡으십시오. 또한 구분 기호가 유사하면 많이 최적화 할 수 있습니다. – lolopop

+0

예 큰 문제이며 명확하지 않습니다. 첫 번째 구분 기호가 d1이라고 가정 해 봅시다. 항상이 사실을 확신하지 못합니다. 스크립트가 미리 알지 못하는 다음 구분 기호까지 내용을 선택해야합니다. d22라고 가정합니다. 그런 다음 스크립트는 d22에서 다음과 항상 알 수없는 구분 기호로 내용을 선택해야합니다. d11이라고 가정합니다. 모든 HTML 페이지에서 약 25 개의 구분 기호를 발견했습니다. – user1466622