首页 > 解决方案 > 当前面没有字符串时,正则表达式匹配字符

问题描述

我试图在标点符号之后匹配空格,以便拆分大量文本,但我看到一些常见的边缘情况,包括地点、标题和常见的缩写:

I am from New York, N.Y. and I would like to say hello! How are you today? I am well. I owe you $6. 00 because you bought me a No. 3 burger. -Sgt. Smith

我将它与re.splitPython 3 中的函数一起使用我想得到这个:

["I am from New York, N.Y. and I would like to say hello!",
"How are you today?",
"I am well.",
"I owe you $6. 00 because you bought me a No. 3 burger."
"-Sgt. Smith"]

这是目前我的正则表达式:

(?<=[\.\?\!])(?<=[^A-Z].)(?<=[^0-9].)(?<=[^N]..)(?<=[^o].)

我决定尝试修复第No.一个,最后两个条件。但它依赖于匹配No独立,我认为这将在其他地方出现误报。我无法弄清楚如何让它只制作No句号后面的字符串。Sgt.然后,我将对遇到的任何其他“问题”字符串使用类似的方法。

我正在尝试使用类似的东西:

(?<=[\.\?\!])(?<=[^A-Z].)(?<=[^0-9].)^(?<=^No$)

但在那之后它没有捕获任何东西。我怎样才能让它排除我希望在其中有一个句点的某些字符串,而不是捕获它们?

这是我的情况的正则表达式:https ://regexr.com/4sgcb

标签: regexpython-3.xregex-lookarounds

解决方案


这是我能得到的最接近的正则表达式(尾随空格是我们匹配的那个):

(?<=(?<!(No|\.\w))[\.\?\!])(?! *\d+ *) 

之后也将拆分Sgt.,原因很简单,即在 Python 中后向断言必须是固定宽度(多么限制!)。

这就是我在 中的做法vim,它没有这样的限制(尾随空格是我们匹配的空格):

\(\(No\|Sgt\|\.\w\)\@<![?.!]\)\( *\d\+ *\)\@!\zs 

对于 OP 和普通读者来说,这个问题及其答案是关于环视的,非常有趣。


推荐阅读