我是编程新手,抱歉,如果这看起来微不足道:我有一段文本,我正试图使用正则表达式将其拆分成单独的句子。使用 .split
方法,我搜索一个点后跟一个大写字母,如
"\. A-Z"
但是我需要按以下方式细化此规则:.
(点)前面不能有 Abs
或 S
.如果它后面跟着一个大写字母 (A-Z
),如果它是月份名称,它应该仍然不匹配,例如 January |二月 |三月
。
我尝试实现前半部分,但即使这样也行不通。我的代码是:
"( (?<!Abs)\. A-Z) | (?<!S)\. A-Z) ) "
最佳答案
首先,我想你可能想用 \s+
替换空格,或者 \s
如果它确实是一个空格(你经常会在英语中找到双空格文本)。
其次,要匹配大写字母,您必须使用 [A-Z]
,但是 A-Z
将不起作用(但请记住可能有其他大写字母而不是 A-Z
...).
此外,我想我知道为什么这不起作用。正则表达式引擎将尝试匹配 \. [A-Z]
如果它前面没有 Abs
或 S
。问题是,如果它前面有一个 S
,它前面不是 Abs
,所以第一个模式匹配。如果它前面有 Abs
,它没有前面有 S
,所以第二个模式版本匹配。无论哪种方式,这些模式之一都会匹配,因为 Abs
和 S
是互斥的。
问题第一部分的模式可能是
(?<!Abs)(?<!S)(\. [A-Z])
或
(?<!Abs)(?<!S)(\.\s+[A-Z])
(根据我的建议)
那是因为你必须避免 |
,没有它,表达式现在说 前面没有 Abs 和 前面没有 S。如果两者都为真,模式匹配器将继续扫描字符串并找到您的匹配项。
为了排除我想出这个正则表达式的月份名称:
(?<!Abs)(?<!S)(\.\s+)(?!January|February|March)[A-Z]
同样的论点也适用于消极的前瞻模式。
关于python - python 正则表达式中的多个负向后断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12689046/