我怀疑re.match搞砸了控制流程

时间:2011-10-20 18:56:43

标签: python regex match

if块中的正则表达式匹配是否会干扰else块内的代码?

在下面的代码中,我有100个测试字符串,这些字符串被输入job_name,应该附加到我的del_job_ids数组中。其中只有99个被追加。

for j in jobs:
     name = jobs[j]['Job_Name'][0]       
     p=re.compile("(\\w*):?\\w*-?\\d*")
     if ((':' in name) or ('-' in name)):
         name=p.match(name).group(1)
     else:
         #if name==job_name and state!='C':
         #print "ok" 
         #del_job_ids.append(j)
         pass
     if name==job_name and state!='C':
         del_job_ids.append(j)
         name=None

如果我注释掉行名= p.match(name).group(1),那么现在之前没有附加的一个案例会被追加。我也可以通过解析else块中的代码来附加该作业(该字符串传递条件以获取附加内容)。

字符串之间的区别在于其中99个字符串有冒号,短划线或两者,而另外两个字符串都没有。我多次测试正则表达式。没有破折号或冒号的字符串应该使用else子句并使用for循环顶部定义的“default”名称。

4 个答案:

答案 0 :(得分:2)

name=p.match(name).group(1)

您正在更改name的内容。这可能使这个错误:

if name==job_name and state!='C':

这使得此声明无法执行:

del_job_ids.append(j)

我建议您查看name声明之后的name.p.match(name).group(1)

答案 1 :(得分:2)

 for j in jobs:
      name = jobs[j]['Job_Name'][0]

这部分对我没有意义。如果'jobs'是可迭代的,那么第一次循环,'j'被设置为'jobs [0]',下一次被设置为'jobs [1]'等等。所以使用'j'来“工作”指数是疯狂的谈话。你说“给我可迭代的'工作'中的下一个元素,然后使用该元素作为'工作'的索引。

答案 2 :(得分:2)

你在做一些非常奇怪的事情。我们来看几个。

1 - name = jobs[j]['Job_Name'][0]

在我看来,也许job是一个字典的容器,它有一个键'Job_Name',而key的值是一个列表或元组。我想你的意思是:

name = j['Job_name'][0]

如果作业只是一个字符串列表,作为作业名称,您只需要: 您可以跳过的name = j - 当您想要引用它时,只需使用j

2 - p=re.compile("(\\w*):?\\w*-?\\d*")

每次进行循环时,您都在编译正则表达式,每次都完全相同,并且您使用一次。在循环开始之前进行编译

3 - 你根本不需要你的其他条款。如果你想在Python中使用“else if”,你可以使用“elif”。

4 - 通过使用原始字符串消除所有双重转义,可以简化正则表达式:p=re.compile(r"(\w*):?\w*-?\d*")

5 - 你的整个正则表达可能是不必要的。如果你正在做我认为你正在做的事情,你只需要在第一个冒号之前出现的东西,如果有的话。 (除非你的意思是group(1),我认为你没有。)这意味着你可以跳过正则表达式(因为你无论如何都与in匹配),并且只使用像{{1 }}

答案 3 :(得分:1)

match()不会“干扰”else子句。

此处最可能的原因是name==job条件导致您的某个测试用例失败。

明智地使用print-statements可能会显示跳过哪个字符串。或者您使用 pdb