我正在使用正则表达式来查找字符串中的主机名,该主机名匹配所有可能的组合但不能构建一个。
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
答案 0 :(得分:3)
你的正则表达式正常。您的问题是如何使用它。您使用了re.search()
。好吧,re
可以在w.stack.in
中找到匹配,因为stack.in
匹配。但是,您想要确保整个字符串匹配。为此,请使用re.match()
。见search()
vs. match()
。第二种选择是将^
放在表达式的开头,说它必须位于字符串的开头。
答案 1 :(得分: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\.)?
。