【发布时间】:2015-01-10 12:36:12
【问题描述】:
假设我想将Mr. 和Mr 的所有匹配项替换为Mister。
我正在使用以下正则表达式:\bMr(\.)?\b 匹配 Mr. 或仅匹配 Mr。然后,我使用re.sub() method 进行替换。
让我感到困惑的是,它正在用Mister. 替换Mr.。为什么要在末尾保留点.?看起来它与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
【问题讨论】:
-
您正在对可选的 '.' 进行分组。字符。
-
您也可以使用解决方法
\bMr\b\.? -
@hwnd 这是个好方法!我喜欢,谢谢。
-
@fedorqui 你想在
foo:Mr:bar中匹配Mr吗? -
@AvinashRaj
:不太可能出现在我的字符串中。唯一可能的情况是Mr-Nobody,它也应该扩展为Mister。因此,想法是所有Mr或Mr.都应扩展为Mister,除非它们后面出现字母数字字符。
标签: python regex python-2.7