gpt4 book ai didi

python - 正则表达式用于匹配顺序无关紧要的相邻单词

转载 作者:行者123 更新时间:2023-12-01 09:23:53 25 4
gpt4 key购买 nike

我正在将正则表达式与python一起使用,并试图找出匹配模式的最佳方法,其中我正在搜索的两个单词的顺序并不重要,但它们必须相邻。例如,我正在搜索短语 “fat cat lasagna co”“cat fat lasagna co”,我必须想象有比这更好的方法只是r"\b(肥猫|猫胖)烤宽面条co\b"

我读到this question它解决了类似的问题,但单词不必相邻,并且无法弄清楚如何将其应用于我的问题。

最佳答案

没有严格更好的解决方案,但有一个替代方案。

现在,如果你有两个普通的单词,比如“fat”和“cat”,那么 (fat cat|cat fat) 无疑是最好的解决方案。但如果你有 5 个单词怎么办?或者,如果您有比 fatcat 更复杂的模式,您不想输入两次?

假设您有 3 个正则表达式模式 ABC,而不是 fatcat ,而不是 fatcat 之间的空格,而是正则表达式模式 S。在这种情况下,你可以使用这个食谱:

(?:(?:(?!\1)()|\1(?:S))(?:(?!\2)()(?:A)|(?!\3)()(?:B)|(?!\4)()(?:C))){3}

如果您没有S,可以简化为

(?:(?!\1)()(?:A)|(?!\2)()(?:B)|(?!\3)()(?:C)){3}

(注意:如果 X 不包含替换 (?:X) 可以简化为 X >|.)

示例

如果我们设置A = fatB = catS = 空间,我们得到:

(?:(?:(?!\1)()|\1 )(?:(?!\2)()fat|(?!\3)()cat)){2}

Try it online.

<小时/>

说明

本质上,我们使用捕获组来“记住”哪些模式已经匹配。为此,我们在这里使用这个小模式:

(?!\1)()some_pattern

这是做什么的?这是一个只匹配一次的正则表达式。一旦匹配,就不会再匹配。如果您尝试在该模式周围添加量词,例如 (?:(?!\1)()some_pattern)* ,它将匹配一次或根本不匹配。

诀窍是使用 backreference在定义该组之前就将其分配给捕获组。由于捕获组以“无法匹配”状态初始化,因此negative lookahead (?!\1) 将成功匹配 - 但仅限第一次。因为紧接着,捕获组 () 匹配并捕获空字符串。从现在开始,负向先行 (?!\1) 将不再匹配。

以此为构建 block ,我们可以创建一个匹配 fatcatcatfat 的正则表达式,同时仅包含单词 fat一次:

(?:(?!\1)()fat|(?!\2)()cat){2}

由于负向先行,每个单词最多只能匹配一次。在末尾添加 {2} 量词可保证两个单词中的每一个完全匹配一次,否则整个匹配失败。

现在我们只需要找到一种方法来匹配 fatcat 之间的空格。嗯,这只是同一模式的细微变化:

(?:(?!\1)()|\1 )

此模式将在第一个匹配项中匹配空字符串,并且在后续的每个匹配项中它将匹配一个空格。

把它们放在一起,瞧:

(?:(?:(?!\1)()|\1 )(?:(?!\2)()fat|(?!\3)()cat)){2}
<小时/>

模板(适合懒人)

2 个模式 AB,带分隔符 S:

(?:(?:(?!\1)()|\1(?:S))(?:(?!\2)()(?:A)|(?!\3)()(?:B))){2}

3 种模式 ABC,带分隔符 S:

(?:(?:(?!\1)()|\1(?:S))(?:(?!\2)()(?:A)|(?!\3)()(?:B)|(?!\4)()(?:C))){3}

4 种模式 ABCD,带分隔符 S >:

(?:(?:(?!\1)()|\1(?:S))(?:(?!\2)()(?:A)|(?!\3)()(?:B)|(?!\4)()(?:C)|(?!\5)()(?:D))){4}

2 个模式 AB,没有 S:

(?:(?!\1)()(?:A)|(?!\2)()(?:B)){2}

3 种模式 ABC,不含 S:

(?:(?!\1)()(?:A)|(?!\2)()(?:B)|(?!\3)()(?:C)){3}

4 种模式 ABCD,不含 S :

(?:(?!\1)()(?:A)|(?!\2)()(?:B)|(?!\3)()(?:C)|(?!\4)()(?:D)){4}

关于python - 正则表达式用于匹配顺序无关紧要的相邻单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com