[英]Regex to match punctuation followed by space with some exceptions
我正在尝试提出一个匹配标点符号(!,?和。)后跟一个空格的正则表达式。 我不希望以“ Mr。”,“ Mrs。”等称呼开头的时间段不匹配...
第一步很简单: r"[\\?|!|\\.] "
但是我正在为第二部分而苦苦挣扎。 这是我到目前为止的内容: r"(?<=[^(Mr|Ms)])\\. "
第二个与“ radar。”或“ cups。”或“ loom。”之类的不匹配,这很糟糕。 我也很难将这两个正则表达式合并为一个。
谢谢。
这应该工作:
(?<!(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模块 。 然后,您可以执行以下操作:
r'(?<!\bMr|\bMrs|\bDr|\bMiss|\bProf)([.,;])(?= |\n|\z)'
旁注:字符类中的所有内容都匹配单个字符 。 这就是为什么使用[^(Mr|Ms)]
会得到意外结果的原因,这是集合Mrs|()
的单个字符的否定字符类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.