python正则表达式中有多个负面的lookbehind断言?

Eli*_*lip 8 python regex

我是编程的新手,对不起,如果这看起来微不足道:我有一个文本,我试图用正则表达式分成单个句子.用这个.split方法我搜索一个点后跟一个大写字母

"\. A-Z"
Run Code Online (Sandbox Code Playgroud)

但是,我需要通过以下方式优化此规则.:(点)可能不会以Abs或之前S.如果它后跟一个大写字母(A-Z),如果它是月份名称,它仍然不匹配,如January | February | March.

我尝试实施上半年,但即使这样也行不通.我的代码是:

"( (?<!Abs)\. A-Z) | (?<!S)\. A-Z) ) "
Run Code Online (Sandbox Code Playgroud)

hoc*_*chl 13

首先,我认为您可能想要替换空间\s+,或者\s它是否真的只是一个空格(您经常在英文文本中找到双空格).

第二,要匹配你必须使用的大写字母[A-Z],但A-Z不起作用(但记住可能还有其他大写字母而不是A-Z......).

另外,我想我知道为什么这不起作用.正则表达式引擎将尝试匹配,\. [A-Z]如果它不在Abs或之前S.问题是,如果它是由一个preceeded S,它不是由preceeded Abs,所以第一个模式匹配.如果它在前面Abs,则不在其前面S,因此第二个模式版本匹配.无论哪种方式,其中一种模式将匹配Abs,因此S是相互排斥的.

问题第一部分的模式可能是

(?<!Abs)(?<!S)(\. [A-Z])
Run Code Online (Sandbox Code Playgroud)

要么

(?<!Abs)(?<!S)(\.\s+[A-Z])
Run Code Online (Sandbox Code Playgroud)

(根据我的建议)

那是因为你必须要避免|,如果没有它,现在表达式不是在Abs之前,而是在S之前.如果两者都为真,则模式匹配器将继续扫描字符串并找到您的匹配项.

为了排除月份名称,我提出了这个正则表达式:

(?<!Abs)(?<!S)(\.\s+)(?!January|February|March)[A-Z]
Run Code Online (Sandbox Code Playgroud)

相同的论点适用于负向前瞻模式.

  • 我是多个后卫的新手.看起来(?<!Abs)(?<!S)与(?<!Abs | S)相同.是否有任何优势(超出个人喜好的简洁/可读性)? (2认同)
  • @jhiro009 是的,当你将它们与 OR(管道)运算符放在一起时,正则表达式要求它们是固定宽度的模式,因此 Abs 和 S 是不兼容的。在这种情况下,您“必须”使用前一种情况。 (2认同)

Nat*_*les 9

我在标题中添加了对问题的简短回答,因为它位于 Google 搜索结果的顶部:

拥有多个不同长度的负向后查找的方法是将它们链接在一起,如下所示:

"(?<!1)(?<!12)(?<!123)example"

这将匹配example 2exampleand3example但不匹配1example 12exampleor 123example