正则表达式匹配标点符号后跟空格,但有一些例外
问题描述:
我想要找出一个匹配标点符号(!,?和。)后跟一个空格的正则表达式。我想不匹配其由类似的“先生”,“太太”等称呼开头段...正则表达式匹配标点符号后跟空格,但有一些例外
做的第一部分很简单: r"[\?|!|\.] "
但我与挣扎第二部分。这是我到目前为止: r"(?<=[^(Mr|Ms)])\. "
第二个不匹配像“雷达”或“杯子”或“织机”,这是不好的。我也无法将这两个正则表达式合并成一个正则表达式。
谢谢。
答
这应该工作:
(?<!(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]: '!'
答
如果想成为完整的,你就需要排除Prof, Dr, Miss, Mrs, Ms, Mr
等
Python的re
模块不允许超过固定宽度的回溯期其他任何东西;为此,你需要为每个宽度做多的回溯期:
r'(?<!\bMr|\bDr)(?<!Mrs)(?<!\bProf|\bMiss)([.,;])(?= |\n|\Z)'
或者使用regex module将允许可变宽度的回溯断言。然后,你可以这样做:
r'(?<!\bMr|\bMrs|\bDr|\bMiss|\bProf)([.,;])(?= |\n|\z)'
边注:一个字符类中任何一个单个字符匹配。这就是为什么你得到意想不到的[^(Mr|Ms)]
结果是否定的字符类集合Mrs|()
的个人字符你将如何修改这个让称呼唯一的例外前一段发生的呢?如果在“!”之前发生称呼,我仍然希望匹配。要么 ”?”。对不起,如果我最初不清楚。 – deruse
@deruse好的,给我几个。将编辑。 –
@deruse编辑。希望有所帮助。 –