如何在lookbehind中忽略特定单词?

4

完整字符串:

See Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.
**Here Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**

我正在使用这段代码来获取**中的句子:

(?i)(?<=\D|![see])Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)

通过给定特定的单词See来忽略它。

但它仍然同时获取两个句子。

这是哪种正则表达式?你尝试过 ^(?!See).* 吗? - Mateen Ulhaq
@MateenUlhaq Python - md123
@MateenUlhaq 我该如何在我的正向后行断言中包含它? - md123
你还有更多想要匹配/不匹配的句子例子吗?因为这似乎是这种情况下最简单的正则表达式。此外,请记住,如果确实需要,您可以应用多个正则表达式的操作(这可能会使事情变得更容易)。 - Mateen Ulhaq
是的,为了简单起见,我只是缩小了测试字符串。我想保留我正在使用的现有代码,并且不匹配回顾中的任何 See - md123
字符 ** 是句子的一部分还是问题中的指示? - The fourth bird
4个回答

0

你可以使用负向回顾前缀:

(?<!See ) 

如果在句子前面出现了“See”,就不会匹配。


0

我建议使用另一种模式(?<=\*\*).+?(?=\*\*)

解释:

(?<=\*\*) - 正向先行断言:断言前面是**

.+? - 匹配一个或多个字符(非贪婪)

(?=\*\*) - 正向后行断言:断言后面是**

演示


0

尝试

(?i)(?<=\D)(?<!See )Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)

这意味着在(?<=\D)之前有不同于数字的东西,但也拒绝了"See "这个东西(?<!See )


看起来不错,但是有没有办法在“See”之后包含.+?,使其比字面上的空格更加健壮? - md123
很不幸,回溯模式必须是固定大小的。 - flaviodesousa
我们能否不使用后顾引用来完成它? - md123
当然,使用类似于(?i)^(?!see)\D+Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)这样的东西。 - flaviodesousa

0
如果您想在回顾中添加一个量词)(?<!\bSee\b.*),可以使用PyPi regex module
(?<=\D)(?<!\bSee\b.*)Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)

Python演示

假设**是用来表示句子之间的差异,你可以看到第二个句子由于结尾处有**而被匹配。

例如:

import regex

pattern = r"(?i)(?<=\D)(?<!\bSee\b.*)Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)"
test_str = ("See Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.\n"
            "**Here Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**")
m = regex.search(pattern, test_str)
print(m.group())

输出

Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**

另一个选择是使用交替匹配不想要的内容并捕获想要保留的内容。
匹配整行中 See 出现在 Item 之前,并使用断言不是数字的后置模式在组1中进行捕获。
(?:^(?:(?!\bItem\b.)*)See\b.*|((?<=\D)Item.+?1A.+?Risk Factors(?=\D).+?(?=Item 1B|$)))

正则表达式演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接