Python 从文本中提取所有域
我需要从字符串中提取域。我有一个有效的正则表达式,它已经过测试,但是我不能让它与下面的代码一起工作。可能是我在这里遗漏了什么Python 从文本中提取所有域,python,regex,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(my
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']
移除锚定,使组不被捕获:
r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'
^
和$
将表达式锁定为仅匹配整个字符串<当模式包含捕获组时,code>re.findall()也会改变行为;您希望在此处列出整个比赛,这要求不存在此类组(…)
是捕获组,(?:…)
是非捕获组
演示:
移除锚定,使组不被捕获:
r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'
^
和$
将表达式锁定为仅匹配整个字符串<当模式包含捕获组时,code>re.findall()也会改变行为;您希望在此处列出整个比赛,这要求不存在此类组(…)
是捕获组,(?:…)
是非捕获组
演示:
问题是在正则表达式的开头包含
^
,在末尾包含$
。这使得它仅在域是整个字符串时匹配。在这里,您希望看到字符串中的匹配项。试着这样改变它
myregex = r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'
编辑
@Martijn指出,这里需要使用非捕获组来获得指定的输出 问题在于在正则表达式的开头包含
^
,在结尾包含$
。这使得它仅在域是整个字符串时匹配。在这里,您希望看到字符串中的匹配项。试着这样改变它
myregex = r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'
编辑
@Martijn指出,这里需要使用非捕获组来获得指定的输出 这里的问题是,您的正则表达式在开头包含^,在结尾包含$,这意味着它只匹配一个同时开始和结束字符串的域(即一个域) 例如,它将匹配“www.stackoverflow.com”,但不匹配“这是www.stackoverflow.com上的一个问题”或“www.stackoverflow.com很棒”
如果您只是从正则表达式中删除^和$,它应该可以正常工作 这里的问题是,您的正则表达式在开头包含^,在结尾包含$,这意味着它只匹配一个同时开始和结束字符串的域(即一个域) 例如,它将匹配“www.stackoverflow.com”,但不匹配“这是www.stackoverflow.com上的一个问题”或“www.stackoverflow.com很棒”
如果您只是从正则表达式中删除^和$,它应该可以正常工作 请注意,OP使用的是
re.findall()
,它要么返回元组列表(模式中的每个匹配组),要么如果只有一个组,则捕获组列表,如果没有组,则捕获整个匹配的列表。对于此模式中的捕获组,这意味着对于给定的示例输入,结果是[('foo','oo'),('bar','ar'),('foobar','oobar')]
。请注意,OP使用的是re.findall()
,它要么返回元组列表(模式中每个匹配的组),要么如果只有一个组,组列表捕获整个匹配的列表,如果没有组,则捕获整个匹配的列表。对于此模式中的捕获组,这意味着对于给定的示例输入,结果是[('foo','oo'),('bar','ar'),('foobar','oobar')]