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