Skip to main content
 首页 » 编程设计

python之用于根据长度过滤单词或通过排除 Python 中的单词的正则表达式

2025年05月04日28thcjp

我一直在努力解决这个问题,但由于我是正则表达式的新手,所以一直没能解决。我需要选择一些 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 

如您所见,我需要排除带有 resume 的那个并选择所有其他的。所以我知道我可以按长度过滤,但我只知道如何按比某物大但不是很多长度的长度进行过滤。例如:"systemstatus get\w{7,}" 将排除 resume 行以及 idle 行。所以实际上我需要过滤长度为 4、7 和 8 的东西。

有人知道怎么做吗?

注意:由于 telnet 库,这必须在正则表达式中完成。

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

请您参考如下方法:

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

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

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

正则表达式详细信息

systemstatus get    # literals 
\b                  # word boundary 
(?:                 # non-capturing group 
\w{4}               # find a word of size 4  
|                   # regex OR pipe 
\w{7,8}             # find a word of size 7 or 8 
) 
\b 

根据您的要求,我们在这里按字长匹配 -

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)