我的表情如下:
^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
什么是最好的方法?
我当时想这样做:
将表达式按空格分成列表。 列表如下:
[^f04[^z]*$,^f00bar$,',',^.*f04.*&~(.*z.*)$,AND,foo,bar,OR,f04ba]
遍历该列表,如果每个替代单词看起来都不像AND,OR或',则在该单词之后添加AND,如果它是',则将其更改为OR。
< / li>这好吗?用Python做到这一点的最佳方法应该是什么?
答案 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'