2016-05-07 2 views
0

Я использую регулярное выражение, чтобы найти имя хоста в строке, которая соответствует всем возможным комбинациям, но не может ее построить.Regex, чтобы найти имя хоста в строке

names = ['www.google.com.in','w.stack.in','www.code31ws.com','google.com','ww.sample.co'] 

regex = '(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)' 
for i in range(len(ips)): 
    reg = re.search(regex,ips[i]) 
    if reg: 
     print "true {}".format(i) 
    else: 
     print "false {}".format(i) 

Результат его:

true 0 
true 1 
true 2 
true 3 
true 4 

Хочет, что он не должен соответствовать:

w.stack.in 
ww.sample.com 
+1

Обратите внимание, что 'w.stack.in' и' ww.sample.com' являются допустимыми именами хостов. – sowa

+0

Рассмотрите библиотеку 'urlparse'. –

+0

[w.stack.in] (http://w.stack.in/) - это даже фактический веб-сайт. –

ответ

3

Ваше регулярное выражение работает нормально. Ваша проблема в том, как вы его используете. Вы использовали re.search(). Хорошо, re найдет матч в w.stack.in, потому что stack.in матчей. Тем не менее, вы должны убедиться, что целая строка совпадений. Для этого используйте re.match(). См. search() vs. match(). Второй вариант заключается в том, чтобы положить ^ в начале выражения, чтобы сказать, что он должен быть в начале строки.

1

Причина это происходит потому, что www не является обязательной и search нужно только, чтобы соответствовать части из строка, так что это просто соответствует остальным:

>>> re.search('(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)', 'w.stack.in').group() 
'stack.in' 

Вы можете это исправить с помощью match, который должен соответствовать всей строке:

>>> re.match('(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)', 'w.stack.in') is None 
True 

Кстати, я бы упростить первую часть просто (www\.)?.

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