繁体   English   中英

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

[英]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]: '!'

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

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

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

如果要完整,则需要排除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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM