仅匹配单词(有时用点分隔)正则表达式
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-z
和A-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 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔