从文本中提取所有域

时间:2014-01-19 00:10:30

标签: python regex

我需要从字符串中提取域名。我有一个有效的正则表达式,已经过测试但是我无法使用以下代码。可能显而易见的是我在这里失踪了

mytext = "I want to extract some domains like foo.com, bar.net or http://foobar.net/ etc"
myregex = r'^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$'
foo = re.findall(myregex, mytext)
print foo

当我想要像

这样的东西时,我只打印出一个空列表
['foo.com','bar.net','foobar.net']

3 个答案:

答案 0 :(得分:3)

删除锚点,并使组不被捕获:

r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'

^$锁定您的表达式以匹配整个字符串。当模式包含捕获组时,re.findall()也会更改行为;你想在这里列出整个比赛,这需要没有这样的组。 (...)是一个捕获组,(?:...)是一个非捕获组。

演示:

>>> myregex = r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'
>>> re.findall(myregex, mytext)
['foo.com', 'bar.net', 'foobar.net']

答案 1 :(得分:0)

问题是在开始时包含^,在正则表达式结尾包含$。这使得它仅在域是整个字符串时才匹配。在这里,您希望查看字符串中的匹配项。尝试改变它

myregex = r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'

修改

@Martijn指出需要在这里使用非捕获组来获取指定的输出。

答案 2 :(得分:0)

这里的问题是你的正则表达式包括开头的^和结尾的$,这意味着它只匹配一个开始和结束字符串的域(即只是一个域)。

例如,它将匹配“www.stackoverflow.com”但不是“这是www.stackoverflow.com上的问题”或“www.stackoverflow.com很棒”。

如果你只是从正则表达式中删除^和$,它应该可以正常工作。 Here's a small example