regex 如何从文本中提取所有域?

gtlvzcf8  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(210)

我需要从一个字符串中提取域。我有一个有效的正则表达式,已经过测试,但是我不能让它与下面的代码一起工作。可能是一些明显的东西,我在这里错过了

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

谢谢你。

sigwle7e

sigwle7e1#

移除锚点,并使组不捕获:

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

^$将表达式锁定为匹配整个字符串 * only *。当模式包含捕获组时,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']
guykilcj

guykilcj2#

这里的问题是,你的正则表达式在开头包含^,在结尾包含$,这意味着它只匹配一个域,该域同时开始和结束字符串(即只是一个域)。
例如,它将匹配“www.stackoverflow.com“,但不匹配“这是www.stackoverflow.com上的问题”或“www.stackoverflow.com很棒”。
如果您只是从regex. Here's a small example中删除^和$,它应该可以正常工作

k3bvogb1

k3bvogb13#

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

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

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

相关问题