在Python中匹配所需字符串并将部分分配给正则表达式分组

在Python中匹配所需字符串并将部分分配给正则表达式分组,python,regex,Python,Regex,我有以下代码片段: 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/dow

我有以下代码片段:

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
在我看来,这个正则表达式应该寻找在etwix和(向上或向下)中包含“osd.0”任何字符的行。然后它将(向上或向下)分配给组(1)。看来我没有找到匹配的。至少我应该说,从打印状态返回是[]

顺便说一句,我还想对表达式中的初始变量进行word绑定,这样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

如果没有匹配项,则跳过该行并继续,如果有匹配项,则将组(1)分配给列表。我并不想争论这一点,但我正在试图理解为什么这个用例是不同的。

在正则表达式中没有任何东西可以匹配
osd.0
up
之间的空格,并且您使用
*
量词是不合适的

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

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

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

r"\b%s\s*\b(up|down)\b"

status.append(match_2.group(1))
不在if语句中我考虑过这一点,但我也想知道它是否必须在if语句中。只有匹配文本的实例,所以若遇到该行,该变量将有值,若并没有,则不会有值。在这一点上,我只是从匹配的行中手动选择分组。这不准确吗?如果您没有匹配项,那么代码将失败,因为您试图获得不匹配的组1。这不是您遇到的问题,但这是一个问题。可能对您有用:
line.split()[-3]。split('.')[1]
。谢谢迈克。这是一个很小的改变,有很大的不同。您还帮助我清理了将/b边框与逻辑or结合使用的语法。这帮了大忙。@user2242146。如果您对此感到满意,请单击投票箭头下方左侧的勾号(复选标记)接受此答案。
r"\b%s\s*\b(up|down)\b"