组合多个regex模式1用于匹配,rest用于排除

2024-05-16 08:22:32 发布

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

我想创建一个python函数,它可以将文本拆分成句子。我想在句点(.),问号(?)上分开或是感叹号(!)。但是,对于这个标准,有一些排除,我已经确定为正则表达式。模式1到5用于排除,模式6用于匹配。我想找到所有与模式6匹配的模式,但不能与模式1到5中的任何一个匹配。在Python正则表达式中可以这样做吗?或者我没有正确的思考方向。在

pattern1 = '\. [a-z]'  
pattern2 = '\.\d' 
pattern2 = '(Mr|Mrs|Dr|Jr)\. [A-Z]' 
pattern4 = '[a-zA-Z]\.[a-zA-Z]' 
pattern5 = '\.(\.|,)'

pattern6 = '\.[\s][A-Z]'

当我把模式1到5与pythex中的|结合起来时

^{pr2}$

我可以找到所有我想排除的场景。然后,我尝试用^排除它们,并与pattern6组合得到一个非常难看的regex:

(^((\. [a-z])|(\.\d)|((Mr|Dr|Jr|Mrs)\.[A-Z])|([A-Za-z]\.[A-Za-z])|(\.(\.|,))))|(\.[\s][A-Z])

为了简单起见,下面是用模式名替换的模式

(^((pattern1)|(pattern2)|(pattern3)|(pattern4)|(pattern5)))|(pattern6)

这在某种程度上是有效的,但失败的情况下与“史密斯先生”等。我刚刚开始学习正则表达式,所以请原谅我的肮脏代码。如能提供编写可读性好的正则表达式的指南,将不胜感激。在

添加样本输入:

Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn't. In any case, this isn't true... Well, with a probability of .9 it isn't.

正确的输出应该是句子列表

错误的输出是在的任何拆分。不标记句子的结尾


Tags: for模式句子hemrmrsdrza
2条回答

您可以考虑只在模式6上拆分,然后使用lookaround排除模式3和模式5,因为尽管实施了模式6(模式3在句点后使用空格+大写字母,模式5用于忽略一行中的句点),因此只有这些模式可以匹配。在

这是一个正面展望的模式6:

\.(?=\s[A-Z])

要排除模式3,请添加负lookbehind:

^{pr2}$

我使用了单独的负lookbehind,因为python的lookbehind不能是可变宽度的。MrDr和{}的长度都是2个字符,但是Mrs3个字符。在

您可以将最后一个regex缩短为:

(?<![MDJ]r)(?<!Mrs)\.(?=\s[A-Z])

现在要排除patter 5,另一个负面观察:

(?<![MDJ]r)(?<!Mrs)(?<!\.)\.(?=\s[A-Z])

在这之后,它就不会在连续的时段上分开了。在

现在已经有了句点,可以很容易地使用字符类在!?上拆分:

(?<![MDJ]r)(?<!Mrs)(?<!\.)[.?!](?=\s[A-Z])

顺便说一句,^在regex中并不完全用于否定。[^ ... ]当你不关心字符顺序时,它被用来否定。例如,[^aeiou]将匹配除字母aeiou以外的任何一个字符。而且,regex中的大多数元字符在字符类中都失去了意义(这就是方括号中所包含的内容)。例如,()成为[]之间的文字字符,不能再用于分组。在

^在字符类之外用来表示行的开头。在

据我所知,没有排除模式^是用来从字符集中排除字符的,就像在[^ab]外它意味着字符串的开始,这不是您想要的

你得做两步比赛

pattern1 = r'\. [a-z]'  
pattern2 = r'\.\d' 
pattern2 = r'(Mr|Mrs|Dr|Jr)\. [A-Z]' 
pattern4 = r'[a-zA-Z]\.[a-zA-Z]' 
pattern5 = r'\.(\.|,)'

pattern6 = r'\.[\s][A-Z]'

if re.match(pattern6):
    if not re.match("("+pattern1+"|"+pattern2+"|"+pattern3+"|"+pattern4+"|"+pattern5+")"):
          do_whatever_you_want()

相关问题 更多 >