说我想用Mr.
替换Mr
和Mister
的所有匹配。
我使用以下正则表达式:\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
答案 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所询问的。这可以在这里看到:
答案 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)