python中的re.search()函数找不到子字符串

Posted

技术标签:

【中文标题】python中的re.search()函数找不到子字符串【英文标题】:re.search() function in python not finding substring 【发布时间】:2019-08-09 05:14:48 【问题描述】:

在“文本”变量中找不到子字符串“无法连接到主机”。我对python相当陌生,我将不胜感激。

import subprocess
import re

host = 'XXXXXXX'
output = subprocess.Popen(['/usr/bin/ssh', '-q', host, 'ifconfig|', 'grep', 'Mask'], stdout=subprocess.PIPE)
text = output.communicate()[0].decode('utf-8')
pattern = 'Failed to connect to host'

if re.search(pattern, text, re.IGNORECASE):
    print('found')
else:
    print('not found')

预期的结果应该是“找到”,因为文本 str 包含该模式,但由于某种原因,结果是“未找到”。

实际输出:

Failed to connect to host XXXXXXX port 22: No route to host
not found

【问题讨论】:

欢迎来到 SO!为了创建minimal reproducible example,如果子流程工作正常并生成正确的text,只需消除它并在text 中进行硬编码。问题是我们不会有和你一样的环境和ssh dir,所以不清楚text 到底是什么,我不知道我在搜索什么。 text 按照@ggorlen 的建议进行硬编码时,它可以正常工作。您的子流程代码可能有问题。您是否检查过消息是否打印到stderr 而不是stdout 尝试打印“输出”和“文本”进行调试。 【参考方案1】:

这是因为错误消息被打印到 stderr,但您只匹配打印在 stdout 上的文本。如果您尝试print(repr(text)),您会看到它打印出''

尝试将stderr=subprocess.STDOUT 添加到您的Popen 呼叫中,如下所示:

output = subprocess.Popen([...], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#                                                        ^-- this

它的作用是将标准错误重定向到标准输出。在此处查看文档:https://docs.python.org/3.7/library/subprocess.html#subprocess.STDOUT

【讨论】:

谢谢!像魅力一样工作。

以上是关于python中的re.search()函数找不到子字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python re模块 正则表达式

用python中re.match匹配为啥一直是None?

Python3中正则模块re.compilere.match及re.search函数用法详解

5-1

Python中正则模块re.compilere.match及re.search函数用法

Python3中正则模块re.compilere.match及re.search函数