Python 用于匹配和提取长域的正则表达式
我想匹配并提取一个域名。我有以下代码行:Python 用于匹配和提取长域的正则表达式,python,regex,Python,Regex,我想匹配并提取一个域名。我有以下代码行: result = re.findall(r"(^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$)", text) 它在example.org,example.org.eu等域中运行良好。但是它不适用于像sub_example.example.org.eu这样的域扩展和修剪您的模式,您可以使
result = re.findall(r"(^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$)", text)
它在
example.org
,example.org.eu
等域中运行良好。但是它不适用于像sub_example.example.org.eu
这样的域扩展和修剪您的模式,您可以使用的模式来匹配第三种类型的字符串是
^(?:(?:xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]?\.)+(?:xn--)?(?:[a-z0-9-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
看
主要的一点是,我将(?:xn-)?[a-z0-9][a-z0-9-{0,61}[a-z0-9]?\.
部分用一个非捕获组进行包装,并用+
对其进行量化(一次或多次重复)
注意:您可以直接将其与re.findall
一起使用,因为我删除了所有捕获组,所以您不需要用括号将其括起来
您不需要第一个(?!-)
,因为下一个消费模式与连字符不匹配,所以我将其删除
详细信息
-字符串的开头^
-1个或多个(?:(?:xn-)?[a-z0-9][a-z0-9-{0,61}[a-z0-9]?\)+
-可选的(?:xn-)?
子字符串xn-
-小写ASCII字母或数字[a-z0-9]
-0到61个小写ASCII字母、数字、[a-z0-9-{0,61}
或-
-可选的小写ASCII字母或数字[a-z0-9]?
-一个点\。
-可选的(?:xn-)?
字符串xn-
-两种备选方案之一:(?:[a-z0-9-]{1,61}|[a-z0-9-]{1,30}\[a-z]{2,30})
-1至61个小写ASCII字母、[a-z0-9-]{1,61}
或数字-
-或|
-1到30个小写ASCII字母、[a-z0-9-]{1,30}.[a-z]{2,}
或数字、一个点和两个小写ASCII字母-
-字符串结束$
re.findall
(我删除了所有捕获组,因此您不需要用括号括起来)。感谢您友好的回答和有关regex的详细信息!