Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本中提取所有域_Python_Regex - Fatal编程技术网

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')]