我见过类似的问题,但我的问题完全不同,我无法单独解决。
给定一行文本,我只想提取主机名,下面是我期望的输入-输出对的示例:
一些很酷的文本 google.ru.ts -> google.ru.ts
忽略 google.com 忽略 -> google.com
google.com/sign_in.htm -> google.com
13.59.135.97/wp-includes/fqhw5-6k88r-dgufy.view/ -> 13.59.135.97
我找到了一个正则表达式来匹配主机名,但它有一些问题:
hostname_pattern = re.compile(r'(?:https?://)?(?:www\.)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})\b')
对于第三个示例,我在输出中得到
in.htm
(除了 google.com 之外)
对于第四个,它返回 fqhw5-6k88r-dgufy.view
我该如何解决这个问题?
我在正则表达式中添加了前缀
\b
,所以它看起来像这样:
hostname_pattern = re.compile(r'(?:https?://)?(?:www\.)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})\b')
现在它不会匹配
in.html
。这解决了第三个样本。
对于第四个示例,您忘记在正则表达式中包含 0 - 9
范围和 +
符号。所以最终的正则表达式将如下所示:
r'\b(?:https?://)?(?:www\.)?([a-zA-Z0-9.-]+\.[a-zA-Z0-9.]{2,})\b'
这是我的文本代码:
inputs = [ i.split('>')[0].strip() for i in """ Some Cool Text google.ru.ts -> google.ru.ts
Ignore google.com Ignore -> google.com
google.com/sign_in.htm -> google.com
13.1234.1.321/wp-includes/fqhw5-6k88r-dgufy.view/ -> 13.59.135.97""".split('\n')]
regex = r'\b(?:https?://)?(?:www\.)?([a-zA-Z0-9.-]+\.[a-zA-Z0-9.]{2,})\b'
for i in inputs:
print(re.findall(regex, i))
这是输出:
['google.ru.ts']
['google.com']
['google.com']
['13.1234.1.321', 'fqhw5-6k88r-dgufy.view']
现在它仍然返回第四种情况的另一个“匹配”,但是您只需从返回的列表中取出第一个元素就可以了。