RegEx - соответствие необязательных групп - PullRequest
2 голосов
/ 09 января 2011

Я знаю, что RegEx - не лучший способ очистить HTML-файлы, но это все ... У меня есть что-то вроде:

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

И мне нужно сопоставить части «Написание» и «Искусство».Но не сказано, что они там, и могут быть другие части, такие как Чернила и Карандаши ...

Как мне это сделать?Мне нужно использовать чистый RegEx, никаких дополнительных библиотек Python.

Ответы [ 5 ]

2 голосов
/ 10 января 2011

Может быть, есть два образца, которые нужно распознать.

  1. Ваши ключевые слова существуют в пределах
  2. за вашими ключевыми словами следует раздел ...

Итак ... сначала извлеките все в

s ... (код псевдо)
while ( match( "<td[^>]*>(.*?)</td[^>]*>" ) ) {
    inner = match[1];
    ...
}

(.*?) означает совпадение не жадно, то есть соответствует минимально возможному. В противном случае вы бы сопоставили все от первого <td> до последнего </td> (вместо следующего </td>).

Затем вы можете перейти к обработке inner порции!

1 голос
/ 09 января 2011
regex = re.compile("(\w+):")
regex.findall(yourString); // returns an array of matching elements

Вы можете проверить это здесь

PS: я настоятельно рекомендую вам пройти через это

1 голос
/ 10 января 2011

Я создал это в конце концов:

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

похоже, это работает ... может быть, это можно немного отполировать. Вы знаете, я начинающий.

0 голосов
/ 11 января 2011

Несмотря на мой предыдущий ответ, я передумал и хотел бы НЕ иметь варианты / альтернативы, а получить их все.Таким образом, это означает, что все, что находится внутри тегов 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>

Я создал:

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

И, похоже, это работает!

Я бы очень признателен, чтобы кто-то проверил и подтвердил мои усилия.

0 голосов
/ 09 января 2011

Вы можете сопоставлять необязательные элементы в регулярных выражениях, используя?после необязательной части.?будет соответствовать 0 или 1 вхождению подвыражения.

...