替换字符间的点号

3

我想在字符串中替换点,当点的前面或后面没有空格时。我认为这可以通过正则表达式轻松实现,但我尝试过之后还无法做到。

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

  • h.e.ll.o w.o.r.l.d: hello world
  • h.e.ll.o w.o.r.l.d: hello world
  • hello. world: hello. world

我已经尝试了以下模式:

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

我将使用Python的re模块来匹配和替换,通常会得到类似于he.ll.o wo.rl.d的结果。
>>> 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'

在Java中进行类似的搜索:https://dev59.com/N17Va4cB1Zd3GeqPKYKW - Evgeny
2个回答

12
在您的所有模式中,点号后面都会消耗一个字符,因此在下一次迭代中与第一个\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) - 否定前瞻,如果当前位置右侧紧接着的是空格,则匹配失败。

这个正则表达式无法匹配 '. h.e.ll.o. w.o.r.l.d' - Mazdak
1
我做到了,谢谢。我之前想反过来了,这样就解决了。 - Jorge Rodriguez Molinuevo

0
这是我的方法。 re.sub(r'\.(?=\w)', '', 'h.e.ll.o. w.o.r.l.d')
  • \. 表示点
  • (?=\w) 向前查找:检查点后面是否有\w。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接