正则表达式匹配标点符号后跟空格,但有一些例外

时间:2017-07-07 14:44:23

标签: python regex

我试图提出一个正则表达式,它匹配标点符号(!,?和。),后跟空格。我想不要匹配之前会有称赞的时期,例如" Mr。"," Mrs."等......

做第一部分很简单: r"[\?|!|\.] "

但我正在努力解决第二部分问题。这是我到目前为止: r"(?<=[^(Mr|Ms)])\. "

第二个不匹配像雷达这样的东西。 &#34;或者&#34;杯子。 &#34;或者&#34;织机。 &#34;这很糟糕。我也很难将这两个正则表达式合并为一个。

感谢。

3 个答案:

答案 0 :(得分:1)

这应该有效:

(?<!(Mr)|(Ms))(?<!(Mrs))[.!?](?=\s|$)

这是一个演示:

In [19]: re.search(r'(?<!(Mr)|(Ms))(?<!(Mrs))[.](?=\s|$))', 'Mrs. Jones!').group(0)
Out[19]: '!'

对于先生和太太来说,有一个负面的观察,对于一个太空或者EOL来说是一个积极的前瞻。

请注意,每个不同长度的单独称呼都需要自己的背后。

根据OP的要求编辑:

In [78]: re.search(r'((?<!(Mr)|(Ms))(?<!(Mrs))[.])|([!?])(?=\s|$)', 'Mrs! Jones').group(0)
Out[78]: '!'

答案 1 :(得分:1)

这是一个有效的工作:https://regex101.com/r/iRNTMY/2

(?<!(Mr|Ms))(?<!(Mrs))[.?!]

对于两种不同长度的可能性,它使用两次负面后视。

答案 2 :(得分:0)

如果想要完成,则需要排除Prof, Dr, Miss, Mrs, Ms, Mr

Python re模块不允许除固定宽度回溯之外的任何内容;因此,你需要为每个宽度做多个回顾:

r'(?<!\bMr|\bDr)(?<!Mrs)(?<!\bProf|\bMiss)([.,;])(?= |\n|\Z)'

Demo

或者使用允许可变宽度回溯断言的regex module。然后你可以这样做:

r'(?<!\bMr|\bMrs|\bDr|\bMiss|\bProf)([.,;])(?= |\n|\z)'

Demo

旁注:字符类中的任何内容都与单个字符匹配。这就是为什么你使用[^(Mr|Ms)]获得意想不到的结果的原因。对于集合Mrs|()

个别字符,这是否定的字符类

Demo