Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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/json/13.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 针对不一致的url筛选提高正则表达式的准确性/简洁性_Python_Regex - Fatal编程技术网

Python 针对不一致的url筛选提高正则表达式的准确性/简洁性

Python 针对不一致的url筛选提高正则表达式的准确性/简洁性,python,regex,Python,Regex,因此,对于一些lulz来说,我和一个朋友在玩弄过滤一个URL列表(100k+)的想法,只检索父域(例如“domain.com|org|等”)。唯一需要注意的是,它们在格式上并不都是好的和匹配的 因此,为了解释,有些可能是“”,有些有国家代码,如“www.domain.co.uk/urlstuff”,而另一些可能有点奇怪,更类似于“hello.in.con.consistent.urls.com/urlstuff” 所以,撇开故事不谈,我有一个有效的正则表达式: import re firstu

因此,对于一些lulz来说,我和一个朋友在玩弄过滤一个URL列表(100k+)的想法,只检索父域(例如“domain.com|org|等”)。唯一需要注意的是,它们在格式上并不都是好的和匹配的

因此,为了解释,有些可能是“”,有些有国家代码,如“www.domain.co.uk/urlstuff”,而另一些可能有点奇怪,更类似于“hello.in.con.consistent.urls.com/urlstuff”

所以,撇开故事不谈,我有一个有效的正则表达式:

import re

firsturl = 'www.foobar.com/fizz/buzz'
m = re.search('\w+(?=(\..{3}/|\..{2}\..{2}/))\.(.{3}|.{2}\..{2})', firsturl)

m.group(0)
返回:

foobar.com
它查找url末尾的第一个“/”,然后返回前面两个“.”分隔的字段

那么,我的问题是,堆栈配置单元中的任何人是否有任何智慧来阐述如何使用更好/更短的正则表达式,或者不依赖字符串中“/”的正向查找的正则表达式来实现这一点


感谢所有在这方面的帮助

您可以改为使用此正则表达式:

import re
firsturl = 'www.foobar.com/fizz/buzz'
domain = re.match("(.+?)\/", firsturl).group()

不过,请注意,这只在没有http://code>的情况下才有效。我确实认为regex正是实现这一点的合适工具。正则表达式是模式匹配,当您有一个已知的模式可能有多个变体时,就可以最好地使用它,如本例中所示

不过,在你解释并试图解决这个问题时,我认为你把它大大简化了。TLD比“2位国家/地区代码”和“3位”其他国家/地区代码更具特色。请参阅以了解当前可用的数百个,长度为2位及以上。此外,您可能有没有任何斜杠和域名后有多个斜杠和点的URL

下面是我的解决方案():

^(?:https?:/)?(?:[^/]+\)*([^/]+\.[a-z]{2,})

您想要的内容将在第一个匹配组中捕获

细分:

  • ^(?:https?:/)?
    在开始时匹配可能的协议
  • (?:[^/]+\)*
    匹配可能的多个非斜杠序列,每个序列后跟一个点
  • ([^/]+\.[a-z]{2,})
    匹配(并捕获)最后一个非斜杠序列,后跟一个点和TLD(2个以上的字母)

您真的需要使用
regex
?像许多问题一样,有很多解决方案。在python中,通过字符串进行迭代是很容易的,而且是python式的,字符串之间用分隔符(“.”)分隔,只需拼凑出我们需要的内容。所以,我知道这在regex之外很容易做到,但在regex的背景下,我很好奇它是否能比我现在做的更好。谢谢你,Brian,我非常感谢!它在更少的假设条件下运行,并且对不一致的字符串具有更强的抵抗能力。这真的很有帮助^^