2017-07-07 188 views
0

我想要找出一个匹配标点符号(!,?和。)后跟一个空格的正则表达式。我想不匹配其由类似的“先生”,“太太”等称呼开头段...正则表达式匹配标点符号后跟空格,但有一些例外

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

但我与挣扎第二部分。这是我到目前为止: r"(?<=[^(Mr|Ms)])\. "

第二个不匹配像“雷达”或“杯子”或“织机”,这是不好的。我也无法将这两个正则表达式合并成一个正则表达式。

谢谢。

回答

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]: '!' 
+0

个人字符你将如何修改这个让称呼唯一的例外前一段发生的呢?如果在“!”之前发生称呼,我仍然希望匹配。要么 ”?”。对不起,如果我最初不清楚。 – deruse

+0

@deruse好的,给我几个。将编辑。 –

+0

@deruse编辑。希望有所帮助。 –

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

相关问题