gpt4 book ai didi

python - 组合多个正则表达式模式 1 用于匹配,其余用于排除

转载 作者:行者123 更新时间:2023-11-28 16:39:21 25 4
gpt4 key购买 nike

我想创建一个可以将文本拆分为句子的 python 函数。我想在句号 (.)、问号 (?) 或感叹号 (!) 上拆分。但是,我已将此标准排除在外,我将其标识为正则表达式。 pattern1 到 5 用于排除,pattern6 用于匹配。我想找到匹配 pattern6 但不能匹配任何模式 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 中,

pattern1|pattern2|patter3|pattern4|pattern5

我可以找到我想要排除的所有场景。然后我尝试用 ^ 排除它们并结合 pattern6 得到一个非常丑陋的正则表达式:

(^((\. [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 上拆分,然后使用环视排除模式 3 和模式 5,因为尽管强制执行模式 6,但它们仍然可以匹配(模式 3 在句点后有空格+大写,而模式 5 必须忽略连续的句点)。

这是具有积极前瞻性的模式 6:

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

要排除模式 3,请添加负面回顾:

(?<!Mr|Dr|Jr)(?<!Mrs)\.(?=\s[A-Z])

我使用了一个单独的负后视,因为 python 的后视不能是可变宽度的。 MrDrJr 都是 2 个字符长,但是 Mrs 是 3.

您可以将最后一个正则表达式缩短为:

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

现在要排除模式 5,另一个负面回顾:

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

在此之后,它不会连续 split 。

现在你已经有了句号,你可以轻松地使用字符类在 !? 上拆分:

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

顺便说一句,^ 并不完全用于正则表达式中的否定。当您不关心字符的顺序时,[^ ... ] 用于取反。例如,[^aeiou] 将以任何顺序匹配除字母 aeiou 之外的任何一个字符。此外,正则表达式中的大多数元字符在字符类中都失去了意义(这就是方括号中的内容)。例如,()成为[]之间的文字字符,不能再用于分组。

^ 在字符类之外使用,表示一行的开头。

关于python - 组合多个正则表达式模式 1 用于匹配,其余用于排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com