2013-03-07 53 views
0

尝试获取domain.zz或domain.zzz或domain.zz.zz或/ something。regexp for(domain.zzz domain.zz.zz domain.zz)and/something/

import re 
the_string = """lalalla?url=http2F%2Fdomain.zz%slgkfgs0s""" 
the_string = """lalalla?url=http2F%2Fdomain.zz.zz/something%slgkfgs0sf""" 
the_string = """lalalla?url=randomh564domain.zzz/something%slgkfgs0sf""" 
the_string = """lalalla?url=randomeefsdlk876%domain.zz/something%slgkfgs0sf""" 
the_string = """p%3A%2F%2Fdummy_test.com/ratata%2F&amp""" 
the_string = """p%3A%2F%2Fdum2test.co.uk/something%2F&-kj""" 

这是我现在有:

>>> print(re.findall('(?:www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4})(?:/[a-z0-9]+)',the_string)) 
domain.zzz/something 
domain.zz/something 
domain.zz.zz/something 

>>> print(re.findall('www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}',the_string)) 
domain.zzz 
domain.zz 
domain.zz.zz 

,我想获得这两个群体有一个重新的问题。

编辑: 这个是近乎完美的: '([a-z0-9 .-] + [。] [az] {2,4})|(?:/ [a-z0-9] +)' ,但它从字符串的开头抓取一些垃圾。

字符串比这个例子更随机: 我专注于那些三种情况:

domain.co.uk/something 
    ^^^
domain.com/something 
    ^^
domain.com 
    ^ 
+0

是域常量? – VladL 2013-03-07 10:52:49

+0

不,不是。它改变。 – okobaka 2013-03-07 10:57:32

回答

1

如何:

import re 
the_string = """[email protected]%slgkfgs0sf""" 
the_string = """[email protected]/something%slgkfgs0sf""" 
#the_string = """[email protected]/something%slgkfgs0sf""" 
#the_string = """lalalla?url=ht%domain.zz/something%slgkfgs0sf""" 
#the_string = """lalalla?url=httpsd%domain.zz.zz/something%slgkfgs0sf""" 
#the_string = """lalalla?url=www.domain.zzz/something%slgkfgs0sf""" 

test = re.compile('(?P<base>[a-zA-Z0-9_\-\.]*?[a-zA-Z0-9_\-]+\.[z\.]+)(?P<extra>/[a-zA-Z0-9_\-]+)') 

for match in test.finditer(the_string): 
    print(match.group('base')) 
    print(match.group('extra')) 

输出继电器:

domain.zz.zz 
/something 

这样你就可以在'基'和'额外'两个数据......将它们结合起来,再次获得完整的字符串。

编辑:更新的更好的域匹配的模式,改变为打印Python 3的语法

+0

我刚刚注意到'\ w'不足以将域名与' - '相匹配,所以我可以重写,如果你想。 – Oli 2013-03-07 11:09:18

+0

嗯,看起来像这个不工作,检查。 – okobaka 2013-03-07 11:18:05

+0

我粘贴了完整的脚本,有什么不适合你? – Oli 2013-03-07 11:21:00

1

试试这个,我不知道这是否完全匹配zyour要求,但也许你可以澄清的问题,模式远一点如果有问题...

print re.findall('=(?:[^@%/.]*(?:@|%(?:2F)?))?(?:www.)?(?P<domain>[^%@/]*)(?:/(?P<folder>[^%]*))?(?:[%@/].*)?$',the_string,re.MULTILINE) 

如果你愿意,你可以用match.group('domain')match.group('folder')

输出访问的部分:

[('domain.zz', ''), ('domain.zz.zz', 'something'), ('randomh564domain.zzz', 'something'), ('domain.zz', 'something'), ('domain.zz.zz', 'something'), ('domain.zzz', 'something')] 
+0

我认为全部不会在这种情况下工作。 – okobaka 2013-03-07 11:44:22

+0

@okobaka你是什么意思? '(?P ...)'只是创建一个命名的子组。寻找'(?P ...)'[here](http://docs.python.org/2/library/re.html#regular-expression-syntax)。也许举个例子说明/为什么它不起作用。 – ted 2013-03-07 11:48:15

+0

我认为它与编码有关。请检查此字符串:“p%3A%2F%2Fdummy_test.com/ratata%2F&amp;” – okobaka 2013-03-07 11:53:53