根据一些愚蠢的条件将表达式拆分为列表

时间:2018-08-16 22:00:01

标签: python regex python-2.7 list

我的表情如下:

^f04[^z]*$ ^f00bar$,^.*f04.*&~(.*z.*)$ AND foo bar OR f04ba

所以,我想在这里做的是:

如果两个连续的单词或regex形式的单词之间用空格分隔,则将该空格更改为单词AND,如果用,隔开,(逗号)将其更改为单词OR,并且如果用AND和OR分隔它们保持原样。

所以,现在看起来应该像这样:

^f04[^z]*$ AND ^f00bar$ OR ^.*f04.*&~(.*z.*)$ AND foo AND bar OR f04ba

另外,最后,如果两个单词之间用AND分隔,那么我想在其周围放一个括号,这样它将如下所示:

(^f04[^z]*$ AND ^f00bar$) OR (^.*f04.*&~(.*z.*)$ AND foo AND bar) OR f04ba

另一个例子:

1。)foo bar OR cat AND crap,flu-> (foo AND bar) OR (cat AND CRAP) OR flu

2。)^.*f04.*&~(.*z.*)$ /k1=v1/ /k2=v2/ bar, cat->

(^.*f04.*&~(.*z.*)$ AND /k1=v1/ AND /k2=v2/ AND bar) OR cat

什么是最好的方法?

我当时想这样做:

  1. 将表达式按空格分成列表。 列表如下:

    [^f04[^z]*$,^f00bar$,',',^.*f04.*&~(.*z.*)$,AND,foo,bar,OR,f04ba]
    
  2. 遍历该列表,如果每个替代单词看起来都不像AND,OR或',则在该单词之后添加AND,如果它是',则将其更改为OR。

    < / li>

这好吗?用Python做到这一点的最佳方法应该是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用...正则表达式来操作正则表达式。首先,使用re.split在每个, OR和每个空格 AND处进行拆分。 / p>

>>> r = "^f04[^z]*$ ^f00bar$,^.*f04.*&~(.*z.*)$ AND foo bar OR f04ba"
>>> groups = [[y for y in re.split(" |AND", x) if y] for x in re.split(",|OR", r)]
>>> groups
[['^f04[^z]*$', '^f00bar$'], ['^.*f04.*&~(.*z.*)$', 'foo', 'bar'], ['f04ba']]

然后,将str.join的人放在一起,并将AND组包裹到(...)中:

>>> ' OR '.join('(' + ' AND '.join(grp) + ')' for grp in groups)
'(^f04[^z]*$ AND ^f00bar$) OR (^.*f04.*&~(.*z.*)$ AND foo AND bar) OR (f04ba)'

但是请注意,即使它们应该是正则表达式的一部分,也会在 all ,处分开。我真的不知道应该如何区分这些。 (可以使用更复杂的正则表达式来代替,|OR,就像您在注释中显示的那样,我没有尝试过。)

此外,这会将连词的每个部分都包装到(...)中,即使它们只有一个元素也是如此。可以通过更复杂的列表理解来首先检查组的len(没有空元素)来解决此问题。

>>> ' OR '.join('(' + ' AND '.join(grp) + ')' if len(grp) > 1 and len(groups) > 1 
...             else ' AND '.join(grp) for grp in groups)
'(^f04[^z]*$ AND ^f00bar$) OR (^.*f04.*&~(.*z.*)$ AND foo AND bar) OR f04ba'