【发布时间】:2018-08-16 22:00:00
【问题描述】:
我有一个如下的表达式:
^f04[^z]*$ ^f00bar$,^.*f04.*&~(.*z.*)$ AND foo bar OR f04ba
所以,我想在这里做的是:
如果 2 个连续的单词或正则表达式形式的单词由空格分隔,则将该空格更改为单词 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。
这样好吗?在 Python 中执行此操作的最佳方法应该是什么?
【问题讨论】:
-
只是一个细节,但应该是
... OR (... AND ...) OR ...还是... OR \(... AND ...\) OR ...? -
是否有
,不应该被替换但被解释为正则表达式的一部分,如{2,4}或[^,.-]? -
添加示例请检查
-
是的,正则表达式的逗号部分应被视为单词的一部分。
-
我在 perl 中使用以下代码执行此操作:将列表拆分为单词,其中一些单词包含逗号作为正则表达式的一部分-> my @array; ## 用逗号分割输入表达式并存储在一个数组中 while ( $exp =~ m{ ((?: [^(),]+ | ( ( (?: [^()]+ | (?2) )* ) ) )+) (?: ,\s* | $) }xg ) { push @array, $1;
标签: python regex python-2.7 list