正则表达式在不带字符串的情况下匹配字符

问题描述 投票:2回答:4

我正在尝试在标点符号之后匹配空格,以便可以拆分大量的文本集,但是我看到一些常见的带有边,标题和缩写的常见情况:

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

我正在Python 3中将它与re.split函数一起使用,我想得到这个:

["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

regex python-3.x regex-lookarounds
4个回答
1
投票

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

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

它也将在Sgt.之后拆分,原因很简单,在Python中,后向断言必须为固定宽度(这是一个限制!)。>

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

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

对于OP和普通读者,this question and the answers to it是关于环视的,非常有趣。


0
投票

仅使用一个正则表达式将很棘手-如评论中所述,有很多极端情况。


0
投票

您可以考虑使用一种匹配的方法,它将为您更好地控制要计数为单个单词而不是句子中断信号的实体。


0
投票

如我在上面的评论中所提到的,如果您不能定义固定的边缘情况集,那么如果没有误报或误报,这可能是不可能的。再者,没有上下文,您将无法在“ -Sgt。Smith”等缩写与“ Sergeant通常被缩写为Sgt。这使得它更短”之类的句子结尾之间进行区分。

但是,如果您可以定义一组固定的边沿情况,则在多个步骤中执行此操作可能更容易且更易读。


1。确定您的极端情况

© www.soinside.com 2019 - 2024. All rights reserved.