python regex中的多个否定lookbehind断言?

2024-05-26 14:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

"\. A-Z"

但是,我需要通过以下方式完善这个规则:点不可以由AbsS来处理。如果它后面跟一个大写字母(A-Z),如果它是一个月名,比如January | February | March,它应该仍然不匹配。

我试着实现上半场,但即使这样也没用。我的代码是:

"( (?<!Abs)\. A-Z) | (?<!S)\. A-Z) ) "

Tags: 方法代码文本规则编程方式abs大写字母
3条回答

使用nltk或@root建议的类似工具。

要回答您的regex问题:

import re
import sys

print re.split(r"(?<!Abs)(?<!S)\.\s+(?!January|February|March)(?=[A-Z])",
               sys.stdin.read())

输入

First. Second. January. Third. Abs. Forth. S. Fifth.
S. Sixth. ABs. Eighth

Output

['First', 'Second. January', 'Third', 'Abs. Forth', 'S. Fifth',
 'S. Sixth', 'ABs', 'Eighth']

我在标题中添加了这个问题的简短答案,因为这是谷歌搜索结果的顶部:

有多个不同长度的负面表情的方法是这样将它们连在一起:

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

首先,我认为您可能需要用\s+替换空间,或者\s替换它,如果它确实是一个空间(在英文文本中经常会发现双空格)。

其次,要匹配一个大写字母,您必须使用[A-Z],但是A-Z不起作用(但请记住,除了A-Z…,可能还有其他大写字母)。

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

你问题的第一部分可能是

(?<!Abs)(?<!S)(\. [A-Z])

或者

(?<!Abs)(?<!S)(\.\s+[A-Z])

(根据我的建议)

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

要排除我想出的月份名称,请执行以下正则表达式:

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

同样的论点也适用于消极的前瞻模式。

相关问题 更多 >

    热门问题