Pythons re.compile是否需要与re.search?

时间:2015-11-15 13:16:40

标签: python regex python-2.7

我正在玩一个程序,如果在通过Paramiko发送的命令的输出中存在某个值,则需要触发该程序,在这种情况下是特定的SSID。

我从命令获得的输出如下所示:

[u'{\n', u"          'autoname' => 0,\n", u"          'class' => 'itfhw',\n", u"          'data' => {\n", u"                      'ap_bridgemode' => 'none',\n", u"                      'bridge' => '',\n", u"                      'client_isolation' => 0,\n", u"        'comment' => '',\n", u"                      'crypto_alg' => 'aes',\n", u"                      'description' => 'Remote Wireless Network',\n", u"                      'dot11r' => 0,\n", u"            'dynamic_vlan' => 0,\n", u"                      'encryption_mode' => 'wpa2_personal',\n", u"                      'freq_bands' => 'a',\n", u"                      'hardware' => 'wlan1',\n", u"                  'hide_ssid' => 0,\n", u"                      'interface_name' => 'wifi1',\n", u"                      'mac' => '00:1a:8c:0a:73:01',\n", u"                      'mac_filter' => 'disable',\n", u"              'mac_list' => '',\n", u"                      'mesh_id' => '',\n", u"  'mesh_mode' => 'none',\n", u"                      'mesh_subtag' => '',\n", u"                      'name' => 'wlan1 (Remote Wireless Network)',\n", u"                      'network_mode' => 'mixed_bgn',\n", u"                      'network_name' => 'Test1',\n", u"                      'psk' => 'secretpw',\n", u"       'r0kh_secret' => 'o2ZT4VYEYB7hhlfQnHmJQONGYnvY12',\n", u"              'ssid' => 'HACKME',\n", u"                      'ssid_vlantag' => '',\n", u"                      'status' => 1,\n", u"                  'time_scheduling' => 0,\n", u"                      'time_select' => [],\n", u"                      'utf8_ssid' => 1,\n", u"               'vlantag' => 101,\n", u"                      'wep128' => '',\n", u"   'wep_authentication' => 'open'\n", u'                    },\n', u"     'hidden' => 0,\n", u"          'lock' => '',\n", u"          'nodel'
=> '',\n", u"          'ref' => 'REF_ItfAweTest1',\n", u"          'type' => 'awe_network'\n", u'        }\n']

这就是我需要搜索ssid名称,在这种情况下是HACKME,以便触发程序的下一部分。那部分看起来像这样:

'ssid' => 'HACKME',\n", u"

如果我使用以下代码

from re import search as re_search
ssid = 'HACKME'
#lots of guff removed
if not re_search('\'ssid\' =\> \'' + ssid +'\'', str(stdout.readlines())):
    continue
else:
    print 'SSID found - let's do something

一切正常。但是,如果我改为使用它:

import re
ssid = 'HACKME'
# lots of guff removed
ssidRegex = re.compile('\'ssid\' => \'' + ssid +'\'')
ssidresult = ssidRegex.search(str(stdout.readlines))
if not ssidresult:
    continue
else:
    print 'SSID found - let's do something'

我可以在相同的输出上相继运行这两个,但它只会在未编译的'它的版本。这正在让我发疯。

在执行过程中,我甚至添加了一个' print ssidRegex.pattern'到我的代码,这对我来说很好。这必然意味着某些事情是非常错误的。输出如下:

'ssid' => 'HACKME'

我现在希望你们中的一个人能够发现我(很可能是非常)明显的错误并让我走上正轨。我知道还有一个额外的' \'在' ='之间和'>'在代码的第一个版本中,但是当我将它添加到编译版本时,我会收到错误,而且我似乎无法正确地将其排除。

是的 - 我知道编译正则表达式可能不会给我的程序增加太多速度,但我想知道我现在在做什么错。纯粹的原则问题。 ;)

1 个答案:

答案 0 :(得分:4)

()之后的代码遗失stdout.readlines

ssidresult = ssidRegex.search(str(stdout.readlines()))
                                                  ^^

<强>更新

使用read方法可能更合适,因为read将返回字符串而不是字符串列表;无需致电str

ssidresult = ssidRegex.search(stdout.read())