替换字符之间的点

时间:2018-06-19 08:35:11

标签: python regex

所以我希望在点之前没有空格时在字符串中使用子点。我认为这可以通过正则表达式轻松完成,但我还没有能够做到。

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

  • h.e.ll.o w.o.r.l.dhello world
  • h.e.ll.o w.o.r.l.dhello world
  • hello. worldhello. world

我尝试过以下模式:

\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'

2 个答案:

答案 0 :(得分:12)

在所有模式中,你在点之后使用一个char,所以在下一次迭代中没有机会匹配它与第一个\w+(因为它必须消耗至少1个字符char)。

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

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

这是Python demo

另一种方法,用于删除字词之间的.

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

this regex demo。在这里,.只有在字符字符内才匹配。

或者,您可以使用此方法匹配任何未附加空白的.

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

请参阅Python demoregex demo

<强>详情

  • (?<!\s) - 如果当前位置左侧有空格,则会导致匹配失败的负面背后隐藏
  • \. - 一个点
  • (?!\s) - 如果当前位置右侧有空格,则会导致匹配失败的否定前瞻。

答案 1 :(得分:0)

这将是我的方法。

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

  • \.
  • (?=\w)向前看:检查点后面是否有\。