python - 我怀疑 re.match 弄乱了控制流

标签 python regex match

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

在下面的代码中,我有 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

如果我注释掉 name=p.match(name).group(1) 这一行,之前没有附加的一个案例现在被附加了。我还可以通过取消注释 else block 中的代码来附加该作业(字符串通过了附加条件)。

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

最佳答案

你在这里做了一些非常奇怪的事情。让我们来看看其中的一些。

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

在我看来,也许工作是一个字典的容器,它有一个键“Job_Name”,这个键的值是一个列表或元组。我想你的意思可能是:

name = j['Job_name'][0]

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

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

您每次通过循环时都在编译您的正则表达式,每次都完全相同,并且您只使用它一次。在循环开始之前执行此编译。

3 - 您根本不需要 else 子句。如果你想在 Python 中使用“else if”,你可以使用“elif”。

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

5 - 你的整个正则表达式可能是不必要的。如果您正在做我认为您正在做的事情,那么您只需要出现在第一个冒号之前的内容(如果有的话)。 (除非你真的是指 group(1),我认为你不是。)这意味着你可以跳过正则表达式(因为你无论如何都要与 in 匹配) ,然后使用类似 name = name.split(':')[0]

的东西

关于python - 我怀疑 re.match 弄乱了控制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840784/

相关文章:

python - 使用pytest测试文件读取功能时出错

python - 如何删除或更改默认的帮助命令?

python - 创建列表或附加到列表(如果已经存在)的有效方法?

c# - 用于删除重复 URL 的正则表达式

当维度不可分时,将大数据框的 nrows 减少到较小数据框的 nrows

使用 p.stdout.read() stty 的 Python 脚本 : standard input: Invalid argument

regex - 用于检测 C++ 模板的 emacs lisp 正则表达式

javascript - 正则表达式性能 : Alternation vs Trie

mysql - 如何以百分比的形式获取mysql匹配的结果?

html - 我可以使用 HTML5 验证 2 input[type=email] 匹配吗?