正则表达式中的可选点

fed*_*qui 19 python regex python-2.7

说我想要替换的所有比赛Mr.,并MrMister.

我使用以下正则表达式:\bMr(\.)?\b匹配Mr.或只是匹配Mr.然后,我使用该re.sub()方法进行替换.

更令人不解的我的是,它正在取代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)
Run Code Online (Sandbox Code Playgroud)

返回:

'a rMr. Nobody Mister. Nobody is Mister Nobody and Mra Nobody.'
Run Code Online (Sandbox Code Playgroud)

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

re.sub(r"\b(Mr\.|Mr)\b","Mister", s)
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

'a rMr. Nobody Mister Nobody is Mister Nobody and Mra Nobody.'
                     ^                              ^
                     no dot            this should be kept as it is
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 15

我想你要捕获'Mr'后跟一个'.' 一个单词边界:

r"\bMr(?:\.|\b)"
Run Code Online (Sandbox Code Playgroud)

正在使用:

>>> 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.'
Run Code Online (Sandbox Code Playgroud)

  • @fedorqui`(\.|\b)`还可以捕获Mr之后的任何内容,因此您可以在重新编写句子后重复使用它.`?:`使它不会发生.它几乎没有对性能和可读性产生任何影响,但如果你重复一个未知的次数,然后需要捕获一个重复组后面的组,它可以帮助很大.使重复组不捕获意味着您事先知道捕获组的索引是什么,而不必先计算它. (3认同)
  • 写`\ bMr\b \是不是更简单.?`? (3认同)

twa*_*lig 7

我认为在原帖中\b是一些混乱的原因.

来自regex101:

\ b匹配,但不消耗任何字符,紧跟在\ w匹配的字符和\ w之间不匹配的字符之间(按任意顺序).

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

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

在此输入图像描述


vks*_*vks 6

re.sub(r"\bMr\.|\bMr\b","Mister", s)
Run Code Online (Sandbox Code Playgroud)

试试这个.你需要删除\b之后.

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

之所以\bMr(\.)?\b之间没有因为工作.space没有单词边界.

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

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