0

我有以下代码片段:

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) 分配给列表。我并不是要争论这一点,但我试图理解为什么这个用例是不同的。

4

1 回答 1

2

您的正则表达式中没有任何内容可以匹配 and 之间的空格osd.0up并且您对*量词的使用不合适。

例如,osd.0*表示匹配osd后跟任意字符之一(换行符除外),后跟字符0零次或多次。

如果您使用re.escape(names[count]),则非字母数字字符将被转义以防止它们被视为特殊的正则表达式字符,osd.0即将被视为osd\.0.

尝试添加\s,以便可以匹配零个或多个空格字符

r"\b%s\s*\b(up|down)\b"
于 2013-04-25T22:44:04.783 回答