正则表达式,用于根据长度过滤单词或在Python中排除单词

2024-06-14 12:52:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力想办法解决这个问题,但由于我在regex是个新手,我一直没能做到。我需要选择一些telnet输出的正确行,如下所示:

systemstatus get resume    # line to exclude
systemstatus get idle      # line to filter
systemstatus get talking   # line to filter
systemstatus get ringing   # line to filter
systemstatus get outgoing  # line to filter
systemstatus get sleeping  # line to filter

如你所见,我需要排除一个与简历和选择所有其他。所以我知道我可以按长度过滤,但我只知道如何过滤比某物大的长度,而不是许多长度。例如:"systemstatus get \w{7,}"将排除resume行,但也排除idle行。所以实际上我需要能过滤4,7和8的长度。在

有人知道怎么做吗?在

注意:由于telnet库的原因,这必须在regex中完成。

注2:由于是telnet,所以当systemstatus get resume出现时,我必须继续阅读(这就是我所说的“排除”),而不是像{}出现时那样停止阅读。因此,通过“systemstatus get WHATEVER”过滤然后排除“resume”将在“resume”出现时停止读取。我正在使用telnet库的telnet.expect([], timeout)。在


Tags: togetlinefilterexcludetelnetregexresume
3条回答

虽然正则表达式功能强大,但实际上并不需要正则表达式,只需拆分、应用和组合即可:

text = """
systemstatus get resume    # line to exclude
systemstatus get idle      # line to filter
systemstatus get talking   # line to filter
systemstatus get ringing   # line to filter
systemstatus get outgoing  # line to filter
systemstatus get sleeping  # line to filter
"""

lines = "\n".join([line for line in text.split("\n") 
                  if line and not "resume" in line])
print(lines)

这就产生了

^{pr2}$

除非您碰巧没有systemstatusresumesystem get idle(意思是resume没有任何单词边界)这样的文本,否则就不需要正则表达式引擎的开销。


时间不同方法(每种10万)产生收益
print(timeit.timeit(noregex, number=10**5))
# 0.28622116599945 s

print(timeit.timeit(regex, number=10**5))
# 0.5753898609982571 s

所以非正则表达式的解只需要一半的时间。在

使用零宽度负前瞻((?!resume(?:\s|$)))来确保resume不在systemstatus get之后:

^systemstatus get (?!resume(?:\s|$)).*$

Demo

选项1
re.MULTILINE开关调用re.findall。在

matches = re.findall(r"systemstatus get \b(?:\w{4}|\w{7,8})\b", t, re.M)

它以字符串列表的形式返回每个匹配项。在

正则表达式详细信息

^{pr2}$

因为你的要求,我们这里按字号匹配-

I need something that filters lengths of 4, 7 and 8.


选项2
将多行字符串拆分为单独的行,遍历每一行并调用re.match

matches = []

for line in t.splitlines():
    if re.match(r"systemstatus get \b(?:\w{4}|\w{7,8})\b", line):
        matches.append(line)  

相关问题 更多 >