我想创建一个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.
正确的输出应该是句子列表
错误的输出是在的任何拆分。不标记句子的结尾
您可以考虑只在模式6上拆分,然后使用lookaround排除模式3和模式5,因为尽管实施了模式6(模式3在句点后使用空格+大写字母,模式5用于忽略一行中的句点),因此只有这些模式可以匹配。在
这是一个正面展望的模式6:
要排除模式3,请添加负lookbehind:
^{pr2}$我使用了单独的负lookbehind,因为python的lookbehind不能是可变宽度的。}的长度都是2个字符,但是
Mr
、Dr
和{Mrs
3个字符。在您可以将最后一个regex缩短为:
现在要排除patter 5,另一个负面观察:
在这之后,它就不会在连续的时段上分开了。在
现在已经有了句点,可以很容易地使用字符类在
!
和?
上拆分:顺便说一句,
^
在regex中并不完全用于否定。[^ ... ]
当你不关心字符顺序时,它被用来否定。例如,[^aeiou]
将匹配除字母aeiou
以外的任何一个字符。而且,regex中的大多数元字符在字符类中都失去了意义(这就是方括号中所包含的内容)。例如,()
成为[]
之间的文字字符,不能再用于分组。在^
在字符类之外用来表示行的开头。在据我所知,没有排除模式
^
是用来从字符集中排除字符的,就像在[^ab]外它意味着字符串的开始,这不是您想要的你得做两步比赛
相关问题 更多 >
编程相关推荐