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
一起使用,因为我删除了所有捕获组,所以您不需要用括号将其括起来

您不需要第一个
(?!-)
,因为下一个消费模式与连字符不匹配,所以我将其删除

详细信息

  • ^
    -字符串的开头
  • (?:(?:xn-)?[a-z0-9][a-z0-9-{0,61}[a-z0-9]?\)+
    -1个或多个
    • (?:xn-)?
      -可选的
      xn-
      子字符串
    • [a-z0-9]
      -小写ASCII字母或数字
    • [a-z0-9-{0,61}
      -0到61个小写ASCII字母、数字、
      -
    • [a-z0-9]?
      -可选的小写ASCII字母或数字
    • \。
      -一个点
  • (?:xn-)?
    -可选的
    xn-
    字符串
  • (?:[a-z0-9-]{1,61}|[a-z0-9-]{1,30}\[a-z]{2,30})
    -两种备选方案之一:
    • [a-z0-9-]{1,61}
      -1至61个小写ASCII字母、
      -
      或数字
    • |
      -或
    • [a-z0-9-]{1,30}.[a-z]{2,}
      -1到30个小写ASCII字母、
      -
      或数字、一个点和两个小写ASCII字母
  • $
    -字符串结束

尝试使用
re.findall
(我删除了所有捕获组,因此您不需要用括号括起来)。感谢您友好的回答和有关regex的详细信息!