我有以下代码片段:
names[count]=osd.0
for line_2 in osd_tree.stdout:
match_2 = re.search(r"%s*(\bup\b|\bdown\b)" % names[count], line_2)
if match_2:
status.append(match_2.group(1))
print status
我正在遍历他以下几行:
# id weight type name up/down reweight
-1 40.25 pool default
-3 40.25 rack unknownrack
-2 10.6 host NC-T920-SAN-10-00
1 1.1 osd.1 up 1
2 1 osd.2 up 1
3 1.1 osd.3 up 1
4 1.1 osd.4 up 1
5 1.1 osd.5 up 1
0 1.1 osd.0 up 1
24 0.8 osd.24 up 1
25 1.1 osd.25 up 1
26 1.1 osd.26 up 1
27 1.1 osd.27 up 1
在我看来,这个正则表达式应该寻找一行包含“osd.0”的任何字符 inbetwix 和(向上或向下)。然后它将(向上或向下)分配给组(1)。我没有得到它出现的匹配。至少我应该说从打印状态返回的是[]。
顺便说一句,我还想在表达式中对初始变量进行单词绑定,以便 osd.1 和 osd.17 不会创建相同的匹配项,但是当我使用以下代码时,会导致以下错误。很明显,语法不正确:
match_2 = re.search(r"\b%s\b*(\bup\b|\bdown\b)" % names[count], line_2)
Traceback (most recent call last):
File "./snmp_osd_check.py", line 44, in <module>
number, names, status = get_osds()
File "./snmp_osd_check.py", line 33, in get_osds
match_2 = re.search(r"\b%s\b*(\bup\b|\bdown\b)" % names[count], line_2)
File "/usr/lib/python2.7/re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "/usr/lib/python2.7/re.py", line 242, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
有任何想法吗?
对于下面的评论,我有以下代码,并且在其他地方可以正常工作:
for line in osds.stdout:
match = re.search(r"(\bosd\.[0-9]*\b)", line)
if match:
names.append(match.group(1))
number.append(count)
如果没有匹配,它会跳过该行并继续前进,如果有匹配,它将 group(1) 分配给列表。我并不是要争论这一点,但我试图理解为什么这个用例是不同的。