加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式:两场比赛之间的负向前瞻

发布时间:2020-12-14 06:23:29 所属栏目:百科 来源:网络整理
导读:我正在尝试构建一个像这样的正则表达式: [match-word] ... [exclude-specific-word] ... [match-word] 这似乎与负面预测有关,但是当我遇到这样的情况时,我遇到了问题: [match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appe
我正在尝试构建一个像这样的正则表达式:
[match-word] ... [exclude-specific-word] ... [match-word]

这似乎与负面预测有关,但是当我遇到这样的情况时,我遇到了问题:

[match-word] ... [exclude-specific-word] ... [match-word] ... [excluded word appears again]

我希望上面的句子匹配,但是第一个和第二个匹配单词之间的负面预测“溢出”,所以第二个单词永远不会匹配.

让我们看一个实际的例子.

我不想匹配每个带有“我”和“馅饼”这个词的句子,而不是那两个词之间的“讨厌”这个词.
我有这三句话:

i sure like eating pie,but i love donuts <- Want to match this
i sure like eating pie,but i hate donuts <- Want to match this
i sure hate eating pie,but i like donuts <- Don't want to match this

我有这个正则表达式:

^i(?!.*hate).*pie          - have removed the word boundaries for clarity,original is: ^ib(?!.*bhateb).*bpieb

哪个匹配第一个句子,但不匹配第二个句子,因为负向前瞻扫描整个字符串.

有没有办法限制负面前瞻,如果在遇到“讨厌”之前遇到“馅饼”,它是否满意?

注意:在我的实现中,此正则表达式之后可能还有其他术语(它是从语法搜索引擎动态构建的),例如:

^i(?!.*hate).*pie.*donuts

我目前正在使用JRegex,但如果有必要,可能会切换到JDK Regex

更新:我在最初的问题中忘了提及:

句子中可能存在“否定结构”,如果有可能,即使“否定”结构存在进一步存在,我也希望匹配句子.

澄清一下,看看这些句子:

i sure like eating pie,but i like donuts <- Don't want to match this
i sure like eating pie,but i like donuts and i hate making pie <- Do want to match this

rob的答案完全适用于这个额外的约束,所以我接受了那个.

在开始和停止单词之间的每个字符处,您必须确保它与您的开头和停用词不匹配.像这样(我在其中包含了一些可读性的小空格):
^i ( (?!hate|pie) . )* pie

这是一个测试事物的python程序.

import re

test = [ ('i sure like eating pie,but i love donuts',True),('i sure like eating pie,but i hate donuts',('i sure hate eating pie,but i like donuts',False) ]

rx = re.compile(r"^i ((?!hate|pie).)* pie",re.X)

for t,v in test:
    m = rx.match(t)
    print t,"pass" if bool(m) == v else "fail"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读