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

时间:2018-01-07 21:44:56

标签: python regex telnet

我一直在努力想出这个,但由于我是正则表达式,我还没有能力。我需要选择一些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库,必须在正则表达式中完成。

注意2:由于它是telnet,我必须在systemstatus get resume出现时继续阅读(我的意思是"排除")而不是像我在做什么时那样停止一个systemstatus get idle进来。所以过滤" systemstatus得到WHATEVER"然后排除" resume"当"恢复"进来了。我正在使用telnet lib的telnet.expect([], timeout)

3 个答案:

答案 0 :(得分:2)

使用零宽度否定前瞻((?!resume(?:\s|$)))确保resume之后systemstatus get不会出现:

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

Demo

答案 1 :(得分:2)

选项1
使用re.findall开关拨打re.MULTILINE

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

由于您的要求,我们在此处根据字号进行匹配 -

  

我需要过滤长度为4,7和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)  

答案 2 :(得分:1)

虽然正则表达式很强大,但这里并不需要它们,只需要拆分,应用和组合:

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)

这会产生

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

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

<小时/> 时间不同的方法(每个100k)产生

print(timeit.timeit(noregex, number=10**5))
# 0.28622116599945 s

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

因此,非正则表达式解决方案只需要一半的时间