我正在尝试创建一个匹配单词 bar
的正则表达式除非有单词 foo
后面。
我发现负向回顾可以解决这个问题,但问题是表达式 [\s\-/]
中有任意数量的字符在 foo
之间和 bar
.
不幸的是,负后视不支持任意长度。
所以模式(?<!foo[\s\-/]*)bar
无效。
你知道可以克服这个问题的正则表达式技术吗?
最佳答案
一个解决方案是:
import re
c = re.compile(r'^(?!.*foo.*bar).*(bar).*$')
lst = ['bar', 'hi bar', 'foo bar', 'foobar', 'hiiifoohiiibar']
for i in lst:
match_obj = c.match(i)
if match_obj:
print(match_obj.group(), '|', match_obj.group(1))
输出:
bar | bar
hi bar | bar
说明 : 首先我们检查整个字符串,看看字符串中是否同时存在'foo'
和'bar'
(首先foo 然后 bar) 与 (?!.*foo.*bar)
。这是一个否定先行断言,如果这对不存在,我们可以继续。
接下来我们确定bar
之前没有任何foo
,我们得到包括bar
在内的所有字符串。我们将它放在一个组中,以便我们可以通过 group(1)
检索它。
关于python - 仅当没有给定前缀和任意数量的空格时才匹配单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69001331/