我试图提出一个正则表达式,它匹配标点符号(!,?和。),后跟空格。我想不要匹配之前会有称赞的时期,例如" Mr。"," Mrs."等......
做第一部分很简单:
r"[\?|!|\.] "
但我正在努力解决第二部分问题。这是我到目前为止:
r"(?<=[^(Mr|Ms)])\. "
第二个不匹配像雷达这样的东西。 &#34;或者&#34;杯子。 &#34;或者&#34;织机。 &#34;这很糟糕。我也很难将这两个正则表达式合并为一个。
感谢。
答案 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)
答案 2 :(得分:0)
如果想要完成,则需要排除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|()