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

2024-05-26 11:12:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的表达:

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

所以,我想做的是:

如果两个连续的单词或regex形式的单词之间用空格隔开,则将该空格改为word,如果用(逗号)隔开,则改为word,如果用AND隔开,则保持原样。你知道吗

所以,现在应该是这样的:

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

最后,如果这两个词之间用分隔符隔开,我想在它周围加一个括号,它看起来如下:

(^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。

这个好吗?在Python中,最好的方法是什么?你知道吗


Tags: orandgt列表foobark1单词
1条回答
网友
1楼 · 发布于 2024-05-26 11:12:37

你可以使用。。。正则表达式。首先,使用re.split分别在每个,OR和每个空间AND进行拆分。你知道吗

>>> 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,处拆分,即使这些应该是regex的一部分。我真的不明白这些应该如何被歧视。(使用更复杂的正则表达式而不是,|OR可能会实现这一点,就像您在注释中显示的一样,我没有尝试这个。)

此外,这将把连接词的每个部分包装成(...),即使它们只有一个元素。这可以通过更复杂的列表理解来解决,首先检查组(sans空元素)的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'

相关问题 更多 >