正则表达式中的可选点

时间:2014-11-13 11:15:47

标签: python regex python-2.7

说我想用Mr.替换MrMister的所有匹配。

我使用以下正则表达式:\bMr(\.)?\b来匹配Mr.Mr。然后,我使用re.sub() method进行替换。

让我感到困惑的是,它正在用Mr.取代Mister.。为什么这会使点.保持在最后?看起来它与Mr\.案例不匹配,只是Mr

import re
s="a rMr. Nobody Mr. Nobody is Mr Nobody and Mra Nobody."
re.sub(r"\bMr(\.)?\b","Mister", s)

返回:

'a rMr. Nobody Mister. Nobody is Mister Nobody and Mra Nobody.'

我也试过以下,但也没有运气:

re.sub(r"\b(Mr\.|Mr)\b","Mister", s)

我想要的输出是:

'a rMr. Nobody Mister Nobody is Mister Nobody and Mra Nobody.'
                     ^                              ^
                     no dot            this should be kept as it is

6 个答案:

答案 0 :(得分:14)

我认为您要捕获'Mr'后跟 '.' 字边界

r"\bMr(?:\.|\b)"

使用中:

>>> import re
>>> re.sub(r"\bMr(?:\.|\b)", "Mister", "a rMr. Nobody Mr. Nobody is Mr Nobody and Mra Nobody.")
'a rMr. Nobody Mister Nobody is Mister Nobody and Mra Nobody.'

答案 1 :(得分:7)

我认为在原帖中,\b是导致某些混淆的原因。

来自regex101

  

\ b匹配,不消耗任何字符,紧接在a之间   由\ w匹配的字符和与\ w不匹配的字符(在任何一个中)   顺序)。

  

\ w匹配任何字母,数字或下划线。

OP期望\b匹配点与其后的空格之间的边界。但它没有,因为点与\w不匹配。相反,\b匹配“Mr”文本和点之间的边界。这导致无法捕获点,这是OP所询问的。这可以在这里看到:

enter image description here

答案 2 :(得分:6)

re.sub(r"\bMr\.|\bMr\b","Mister", s)

试试这个。您需要在\b

后删除.

输出:a rMr. Nobody Mister Nobody is Mister Nobody and Mra Nobody.'

由于\bMr(\.)?\b.之间没有单词边界,space无法正常工作的原因。

有三种不同的职位符合词边界:

  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

答案 3 :(得分:3)

>>> s="a rMr. Nobody Mr. Nobody is Mr Nobody and Mra Nobody."
>>> re.sub(r'\b(Mr[\.\s]\s*)',r'Mister ',s)
'a rMr. Nobody Mister Nobody is Mister Nobody and Mra Nobody.'

答案 4 :(得分:3)

re.sub(r'\bMr[\s\.]', 'Mister ', s)

如果这是Code Golf我会赢吗?

答案 5 :(得分:0)

@ jonsharpe的回答有效,但这个有点简单:\bMr(\.|\b)

http://regex101.com/r/sC9nG6/2