2011-01-09 3 views
2

내가 정규식 HTMLs을 긁어하는 가장 좋은 방법은 아니라는 것을 알고 있지만, 내가 좋아하는 어떤 일이 ... 그 것이다 옵션 그룹을 일치 :정규식

<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a> Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td> 

을 그리고 나는 쓰기와 예술을 일치 할 필요 부분품. 하지만 그들은 거기에 있다고하지 않으며 잉크와 연필과 같은 다른 부분이있을 수 있습니다 ...

어떻게해야합니까? 나는 pure RegEx를 사용할 필요가있다. 파이썬 라이브러리는 없다.

+5

"최선의 방법은 아닙니다", 그것은 방법이 아닙니다. 국수로 손톱을 망치는 것이 필요하다면 그것을 성취하지 못하는 것이 내 잘못이며, 당신 잘못이 아닙니다. – msw

+0

그래, 맞아. 어떻게 든 그렇게하지 않으면 ... 파이썬에서 추가 라이브러리없이 html을 읽는 방법에 대한 제안이 없다면 ... – Maurizio

+0

죄송합니다. 가혹한 소리를 내 보이려하지 않았습니다. .. 정말로 모든 태그를 읽을 필요는 없습니다. 특정 태그를 읽을 필요가 없습니다. 이렇게 할 수 있다고 생각합니다. 나는 틀릴 수도 있습니다 ... 감사합니다! – Maurizio

답변

0

이전 답변에도 불구하고 마음이 바뀌었기 때문에 옵션을 사용하지 않으려합니다. 따라서 TD 태그 안에있는 것이 무엇이든지 포착하여 적절하게 분류해야합니다. 캡쳐 그룹을 선택적으로 만들어야하므로 레이아웃이 무엇이든간에 여전히 콘텐츠를 검색 할 수 있습니다.

<td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td> 

를 그리고이 작동 것 같습니다 : 그것은 내가 만든

<td> Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td> 
<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a> Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=BKa">Bob Karp</a> Pencils: <a href="creator.php?c=AT">Al Taliaferro</a> Ink: <a href="creator.php?c=AH">Al Hubbard</a> </td>  
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=VLo">Vic Lockman</a> Art: <a href="creator.php?c=KWr">Kay Wright</a> </td> 
<td> Writing: <a href="creator.php?c=MGa">Michele Gazzarri</a> Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td> 

:이 함께 즉 작동합니다!

정말 고맙습니다. 누군가 내 노력을 확인하고 유효성을 검사 해 주셔서 감사합니다.

+0

을 보내 주셔서 감사합니다. 태그 사이의 이름을 간단히 가져온 다음 파이썬으로 제거 할 수는 있습니다 ...하지만 즐겁습니다! – Maurizio

+0

당신이 여기에서 어려움을 겪는 것은 여러 경기를 다루는 것입니다. 'td's ... 사이에 글쓰기와 그림을 둘 다 가지고 있다고 가정하면, 검사 할 일치 번호를 알 수 없습니다. 여러 단계의 프로세스를 제안합니다. 먼저,'td' 내의 모든 것을 추출하십시오. 그런 다음 루프 내에서 전역 일치 (즉 한 번에 하나의 결과 반환) 하지만 당신은 정규 표현식의 문법을 이해하고있는 것 같습니다. –

0

정규 표현식의 선택적 항목을? 옵션 부분 다음에. ? 하위 표현식이 0 번 또는 1 번 일치합니다.

1
regex = re.compile("(\w+):") 
regex.findall(yourString); // returns an array of matching elements 

당신은 그것을 here

PS를 테스트 할 수 있습니다 : 내가보기 엔 내가 결국이 만든 당신이 this

1

통해 이동하는 것이 좋습니다 :

는 노력처럼 보인다
(Art:|Pencils:|Ink:|Writing:){0,4}.<a href="creator\.php\?c=[^">]*?\"\>(?P<Name>.*?)\</a\> 

.. 어쩌면 약간 연마 될 수 있습니다. 나는 당신이 알고있는 초보자이다.

2

아마도 두 가지 패턴을 인식 할 수 있습니다.

  1. 키워드 내에 존재 < TD> ... </TD>
  2. 키워드가 < 다음됩니다> ... </A> 섹션

그래서 .. 첫째 < 내에서 모든 것을 추출 TD>의 (사이비 코드)

while (match("<td[^>]*>(.*?)</td[^>]*>")) { 
    inner = match[1]; 
    ... 
} 

(.*?) 수단 즉, 비 탐욕과 일치 최소 가능한 일치하십시오. 그렇지 않은 경우 첫 번째 <td>부터 마지막까지</td> (다음 : </td> 대신)까지 모두 일치하게됩니다.

그런 다음 inner 부분을 처리 할 수 ​​있습니다!

+2

이것과 다른 좋은 단어들 :-) 두번째 생각으로 – Maurizio