【问题标题】:capture string patter with letf and right spans not including this pattern捕获左右跨度不包括此模式的字符串模式
【发布时间】:2020-02-07 08:53:14
【问题描述】:

我找不到解决我的正则表达式问题的方法。

这里是文字: My text is so interesting, depending "interesting" meaning of course.

我想匹配所有包含例如interest.{3} 的字符串,并尽可能向左和向右扩展而不再次匹配interest.{3}。所以我想要这些比赛:

My text is so interesting, depending "interestin

nteresting, depending "interesting" meaning of course.

有什么方法可以通过 PCRE 正则表达式实现这一点?

非常感谢!

【问题讨论】:

  • 您能否澄清一下“尽可能向左和向右传播而不匹配interest{.3}”是什么意思?你的例子没有帮助。
  • 我想匹配模式 interest{.3} 并在该模式的左右两侧获得尽可能多的上下文,但不让该模式出现在左右上下文中。
  • @arnaudbey interest{.3} 不是有效的正则表达式模式。您的意思是interest.{3}(即“兴趣”后跟三个字符)?
  • 是的,抱歉打错了,我的意思是感兴趣。{3}

标签: regex pcre


【解决方案1】:
import re

text = 'Here is text : My text is so interesting, depending "interesting" meaning of course.'

s = text
while True:
    m = re.search(r'(?:.*?)i(nterest\w{2})(\w)(?:(?<!i\1)(?!=\2).)*', s)
    if not m:
        break
    print(m[0])
    s = s[m.span(1)[0]:]

打印:

Here is text : My text is so interesting, depending "interestin
nteresting, depending "interesting" meaning of course.

Demo

(?:.*?)i(nterest\w{2})(\w)(?:(?<!i\1)(?!=\2).)*

我们正在寻找的字符串被分解成碎片:

  1. 'i' 匹配 i
  2. (nterest\w{2}) 捕获组 1 -> interest 加上我们匹配的前两个单词字符。
  3. (\w) Capture group 2 -> 我们比赛的第三个也是最后一个角色。

然后我们一次扫描一个字符,只要前面的字符不是i加上捕获组1并且下一个字符不是捕获组2:

  1. (?:(?&lt;!i\1)(?!=\2).)*

然后我们使用捕获组 1 的位置来确定下一次扫描应该从哪里开始。

【讨论】:

    【解决方案2】:

    除了@Booboo 的回答之外,这里还有一个适用于此的正则表达式。有趣的是,这在 Java 中不起作用,但在 Python 中却很好。这里的一个区别是没有反向引用允许interestinginterested. 被视为同一文本中的匹配项。您可以在regex101.com 上试用。它在那里工作。

    (?=((^|interest.{3}).*?interest.{3}.*?(interest.{3}|$)))
    

    说明

    • X = interest.{3}。然后,这个正则表达式简化为更通用的(?=((^|X).*?X.*?(X|$)))
    • 此外,我考虑过说“在 X 的右侧和左侧”与“X 在跨度的中间”相同(当然有一些保留)。

    基于此:

    1. 整个正则表达式是带有捕获组(?=(regex)) 的正前瞻。这意味着虽然比赛将针对X,但它不会将其位置移动到当前比赛的结尾(以寻找下一场比赛)。相反,由于捕获组,它将在字符串中逐个字符地移动以获取所有匹配项。 (但是,在 Java 中,它的工作方式似乎有所不同。)
    2. 捕获组(^|X) 允许匹配文本的开头或X(边界情况)。
    3. 第二个X 是允许X 出现在“span”的中间。
    4. 捕获组(X|$),与第 (2) 点中的第一个一样,是允许边界 X 也可能是 EOT。

    【讨论】:

    • 我确实注意到您原始帖子中My text is so interesting, depending "interestin 中缺少g 以及nteresting, depending "interesting" meaning of course. 中缺少起始i。由于您没有特别提到它们必须这样,所以我继续发布了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多