2015-05-21 3 views
1

У меня есть некоторые текстовые данные следующим образом.Объяснение для сложного регулярного выражения

{"Timestamp": "Tue Apr 07 00:32:29 EDT 2015",Title: Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance <br><br>Product: Gecko<br>CPUs: 8<br>Language: en-GB"} 

С текстом ниже, я извлекая название только (Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance), используя следующее регулярное выражение:

appcodename = re.search(r'Title: ((?:(?!<br>).)+)', message).group(1) 

Я пытаюсь понять, как работает над регулярным выражением.

(?!<br>) является отрицательным опережением для <br>

(?:(?!<br>).)+) - что это значит? Может кто-то сломает это для меня. Также, сколько групп захвата есть в регулярном выражении.

+0

Это не сложно. Вы, очевидно, не видели [это] (http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html). –

+0

@rr - Только что начал обматывать мою голову вокруг регулярного выражения.Вероятно, дойдет до этого через пару лет :) – liv2hak

+1

@ liv2hak: :) Продолжайте экспериментировать, помните, что каждый, кто отвечает здесь, также изучает его все больше и больше каждый день. –

ответ

3

Вам не нужно такое сложное регулярное выражение, чтобы получить заголовок. Используйте

Title:\s*(.*?)(?=\s*<br/?>) 

См demo

Мы сопрягать Title:, затем пробел \s*, то любые символы до ф <br/> с (.*?)(?=\s*<br/?>).

Что касается (?:(?!<br>).)+, значит улавливать 1 или более символов не с <br>. Существует SO post where this construction is explained in detail.

Вот изображение из regex101 (перейти к Regex Debugger вкладки, а затем нажмите + справа) с визуализацией, что это конструкция делает (проверяет, является ли следующий символ <br>, а если нет, потребляет и откатывается и т.д.):

enter image description here

Что касается вопроса о том, сколько захвате группы есть в регулярном выражении, Title: ((?:(?!<br>).)+) имеет 1 захват (((?:(?!<br>).)+)) и 1, не захватив ((?:(?!<br>).)).

+0

спасибо :) Но я пытаюсь учиться. Мне бы хотелось знать, почему работает мое регулярное выражение :) – liv2hak

+0

Я добавил объяснение. –

+1

Также проверьте ссылку, которую я добавил. –

2

Прежде всего, вам здесь не нужно смотреть. Что вы делаете, может быть сделано с помощью этого простого регулярного выражения также:

>>> re.search(r'Title: *(.+?) *<br>', message).group(1) 
"Indian Herald: India's Latest News, Business, Sport, Weather, Travel, Technology, Entertainment, Politics, Finance" 

кстати вашего регулярное выражение:

Title: ((?:(?!<br>).)+) 

использует negative lookahead(?!<br>), который проверяет наличие <br> перед сопоставлением символа после буквального текста Title:.

+0

если это после каждого символа, то почему. после негативного ожидания? – liv2hak

+1

Да, мой плохой, он проверяет наличие '
' ** перед ** совпадением символа. – anubhava

1

((?:(?!<br>).)+) Что означает:

((?:(?!<br>).)+) 
^... Match the regex and capture its match into backreference 1 

((?:(?!<br>).)+) 
^... Match the regex (non capturing group) 

((?:(?!<br>).)+) 
    ^... Assert that it is not possible to match the regex <br> 

((?:(?!<br>).)+) 
      ^... Match a single character, that is not a line break character 

((?:(?!<br>).)+) 
       ^... Between one and unlimmited times 
+0

захватить его матч в backreference 1 - означает, что он захватывает группу 1? – liv2hak

+1

@ liv2hak yes, backreference 1 = группа захвата 1 – Andie2302

+0

Группа, не связанная с захватом, применяется только к
или также к '.'? – liv2hak

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