我需要从一个字符串中提取域。我有一个有效的正则表达式,已经过测试,但是我不能让它与下面的代码一起工作。可能是一些明显的东西,我在这里错过了
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条答案
按热度按时间sigwle7e1#
移除锚点,并使组不捕获:
^
和$
将表达式锁定为匹配整个字符串 * only *。当模式包含捕获组时,re.findall()
也会更改行为;您要在此处列出整个匹配项,这要求不存在此类组。(...)
是捕获组,(?:...)
是非捕获组。演示:
guykilcj2#
这里的问题是,你的正则表达式在开头包含^,在结尾包含$,这意味着它只匹配一个域,该域同时开始和结束字符串(即只是一个域)。
例如,它将匹配“www.stackoverflow.com“,但不匹配“这是www.stackoverflow.com上的问题”或“www.stackoverflow.com很棒”。
如果您只是从regex. Here's a small example中删除^和$,它应该可以正常工作
k3bvogb13#
问题在于正则表达式的开头包含
^
,结尾包含$
。这使得它仅在域是整个字符串时才匹配。在这里,您希望查看字符串内的匹配项。请尝试如下更改@Martijn指出,这里需要使用非捕获组来获得指定的输出。