2014-12-07 3 views
0

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

>>> msg = ':morgan.freenode.net 353 MechaBot = #xshellz :MechaBot ITechGeek zubuntu whitesn JarodRo SpeedFuse st3v0 anyx danielhyuuga1 AussieKid92 JeDa Failed Guest83885 RiXtEr xryz D-Boy warsoul buggiz rawwBNC MagixZ fedai Sunborn oatgarum dune SamUt Pythonista_ +xinfo madmattco BuGy azuan DarianC stupidpioneers AnTi_MTtr JeDaYoshi|Away PaoLo- StephenS chriscollins Rashk0 morbid1 Lord255 victorix [DS]Matej EvilSoul `|` united Scrawn avira ssnova munsterman Logxen niko gorut Jactive|OFF grauwulf b0lt saapete' 
>>> r = re.compile(r"(?P<host>.*?) (?P<code>.*?) (?P<name>.*?) = (?P<msg>.*?)", re.IGNORECASE) 
>>> r.search(msg).groups() 
(':morgan.freenode.net', '353', 'MechaBot', '') 

ответ

1
(?P<host>.*?) (?P<code>.*?) (?P<name>.*?) = (?P<msg>.*) 

Попробуйте this.This использовать код works.See demo.Your .*? whch говорит матч, как несколько символов, как вы can.So в то время как ваши предыдущие вы использовали .*? <space> он соответствует ДО первого места он встречает, в последнем случае вы не указали anythng.So это не соответствует никому, поскольку он в ленивом режиме.

https://regex101.com/r/aQ3zJ3/1

Вы также можете использовать

(?P<host>.*?) (?P<code>.*?) (?P<name>.*?) = (?P<msg>.*?)$ 

, который говорит, что матч лениво ДО конца.

+0

Хорошо, что работает. Не могли бы вы объяснить, почему '?' Не нужно, пожалуйста? –

+0

@ DanielHyuuga: Если вы сделаете последнюю группу неживой, она будет соответствовать пустой строке. Regex не пытается использовать всю входную строку, как вы, вероятно, думаете. Как только шаблон полностью совпадает, все кончено. –

+0

@ DanielHyuuga см. Отредактированный ответ – vks

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