我一直在努力想出这个,但由于我是正则表达式,我还没有能力。我需要选择一些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)
。
答案 0 :(得分:2)
使用零宽度否定前瞻((?!resume(?:\s|$))
)确保resume
之后systemstatus get
不会出现:
^systemstatus get (?!resume(?:\s|$)).*$
答案 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
没有任何单词边界),否则不需要正则表达式引擎的开销。
print(timeit.timeit(noregex, number=10**5))
# 0.28622116599945 s
print(timeit.timeit(regex, number=10**5))
# 0.5753898609982571 s
因此,非正则表达式解决方案只需要一半的时间。