首页 > 解决方案 > 替换字符之间的点

问题描述

所以我想在点之前没有空格时替换字符串中的点。我认为这可以通过正则表达式轻松完成,但我无法做到。

我有模式,我希望它们是:

我尝试了以下模式:

\w+(\.)+\w+
\w+(\.+\w+)
\w+\.+\w+

我总是得到类似的东西:he.ll.o wo.rl.d

我正在使用 python 的re模块来匹配和替换以下代码:

>>> re.sub(r'\w+\.+\w+', lambda x: x.group(0).replace('.', ''), 'h.e.ll.o w.o.r.l.d')
'he.llo wo.rl.d'

标签: pythonregex

解决方案


在您的所有模式中,您在点之后消耗一个字符,因此在下一次迭代中没有机会将它与第一个匹配\w+(因为它必须消耗至少 1 个单词字符)。

要修复您的方法,您可以匹配 1+ 个单词字符,然后是 1+ 个重复,.然后是 1+ 个单词字符:

re.sub(r'\w+(?:\.+\w+)*', lambda x: x.group(0).replace('.', ''), s)

这是Python 演示

在单词字符之间删除.的另一种方法是

re.sub(r'\b\.\b', '', s)

请参阅此正则表达式演示。在这里,.只有在单词字符内的情况下才匹配。

或者,您可以使用这种方法来匹配任何.未包含空格的内容:

re.sub(r'(?<!\s)\.(?!\s)', '', 'h.e.ll.o w.o.r.l.d')

请参阅Python 演示正则表达式演示

细节

  • (?<!\s)- 如果在当前位置的左侧有一个空格,则匹配失败的负向后查找
  • \.- 一个点
  • (?!\s)- 如果当前位置的右侧有空格,则匹配失败的负前瞻。

推荐阅读