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”名称。
答案 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 。