所以我希望在点之前没有空格时在字符串中使用子点。我认为这可以通过正则表达式轻松完成,但我还没有能够做到。
我有模式,我希望它们是:
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+
我总是得到: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'
答案 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')
<强>详情
(?<!\s)
- 如果当前位置左侧有空格,则会导致匹配失败的负面背后隐藏\.
- 一个点(?!\s)
- 如果当前位置右侧有空格,则会导致匹配失败的否定前瞻。答案 1 :(得分:0)
这将是我的方法。
re.sub(r'\.(?=\w)', '', 'h.e.ll.o. w.o.r.l.d')
\.
点(?=\w)
向前看:检查点后面是否有\。