仅匹配单词(有时用点分隔)正则表达式

Posted

技术标签:

【中文标题】仅匹配单词(有时用点分隔)正则表达式【英文标题】:Match only words (sometimes with dots seperating) regex 【发布时间】:2021-10-20 08:14:20 【问题描述】:

我有一个这样的列表:

example.com=120.0.0.0
ben.example.com=120.0.0.0
+ben.example=120.0.0.0
+ben.example.com.np=120.0.0.0
ben=120.0.0.0
ben-example.com=120.0.0.0
ben43.example.com=120.0.0.0

我只需要找到单词(用点分隔)。 没有 ips,=, + 等等。 有些 FQDN 有多个点,有些根本没有,等等。

这可能吗?

如果脚本在我运行正则表达式时运行良好,我只想得到这些:

ben.example.com.np
ben.example
ben.example.com
example.com
ben
ben43.example.com

我想通过 python regex 将文件解析为 ips 和 FQDNS,以便我可以使用它并检查 ips 是否可用于域。

【问题讨论】:

【参考方案1】:

这很简单

import re
fqdns = re.findall(r"[a-zA-Z\.-]2,", text, flags=re.M)

给予

['example.com', 'ben.example.com', 'ben.example', 'ben-example.com.np', 'ben']

regex101 example here

该组匹配a-zA-Z 范围内的所有字符,以及点.-2, 表示连续匹配至少 2 个字符,因此不会匹配 IP 中的点。


编辑:在我写完这个答案后,问题的参数略有变化,因为一些 URL 包含数字。因此,不要使用re.findall() 来获取(可能是多行)输入中的所有匹配项,而应该使用re.match().group() 并稍微改变正则表达式并逐行处理输入:

import re

with open("path/to/file", "r") as f:
    fqdns = [re.match(r"(?:[a-zA-Z\.\-0-9]2,)", line).group() for line in f]

re.match(),在没有任何标志的情况下,在该行的第一个匹配之后返回。 .group() 是您访问匹配字符串的方式。

【讨论】:

嘿,我忘了提。有些人之间也有 - (更新问题。)通过添加以下内容来修复它:[a-zA-Z\.\-]2, 我刚刚检查过,显然文件中的 2 条记录也有数字。也可以解析吗?看起来有点像:ben.example43.com @benshalev 如果你正在逐行处理你的文件,这应该工作:re.match(r"(?:[a-zA-Z\.\-0-9]2,)", text).group()re.findall() 在这种情况下不起作用,因为正则表达式也会识别 IP。 re.match() 这里只会返回该行中的第一个匹配项。

以上是关于仅匹配单词(有时用点分隔)正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配用括号括起来并用管道分隔的所有单词

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

使用正则表达式匹配多个逗号分隔的单词

C# 正则表达式匹配具有分隔符的字符串

Python 正则表达式匹配包含两个或更少 o 字符的空格分隔的单词

正则表达式仅匹配大写“单词”,但有一些例外