2011-01-09 3 views
2

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

<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

Это не «не лучший способ», это не путь. Если я требую, чтобы вы забили гвоздь лапшой, неспособность выполнить это - моя вина, а не ваша. – msw

+0

Да, правильно. Не сделал бы этого, если бы я не был каким-то образом вынужден так поступать ... если у вас нет предложения о том, как читать html без дополнительных библиотек в Python ... – Maurizio

+0

Извините, не означает, что это звучит резким. .. Мне действительно не нужно читать все теги, только некоторые конкретные, поэтому я думаю, что это можно сделать ... Я мог ошибаться, хотя ... спасибо! – Maurizio

ответ

0

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

как вторая мысль, я мог бы просто получить имена между тегами, а затем разбить их на Python ... но мне понравилось! – 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>
  2. ключевые слова сопровождаются < а> ... </а> раздел

Так .. сначала извлечь все, что в < тд> s ... (псевдо код)

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

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

Тогда вы можете перейти к обработке участка inner!

+2

Спасибо за это и другие хорошие слова :-) – Maurizio

Смежные вопросы