用于连接的Python正则表达式替代方案

时间:2014-12-13 10:45:43

标签: python regex

假设我有一个字符串string = 'abcdefghi',我希望输出为'a-b-c-d-e-f-g-h-i'我可以轻松使用'-'.join(string)并获得所需的输出。但是,如果我想使用正则表达式做同样的事情呢?我如何使用正则表达式做同样的事情?

我在问,因为我正在学习使用正则表达式,并想知道如何思考它。

3 个答案:

答案 0 :(得分:9)

使用环顾四周的解决方案

>>> import re
>>> str="abcdefghi"
>>> re.sub(r'(?<=\w)(?=\w)', '-', str)
'a-b-c-d-e-f-g-h-i'
  • (?<=\w)声称信件由位置提出

  • (?=\w)声称信后面是位置

>>> re.sub(r'(?<=.)(?=.)', '-', str)
'a-b-c-d-e-f-g-h-i'

答案 1 :(得分:6)

保持简单.....

>>> string = 'abcdefghi'
>>> import re
>>> re.sub(r'\B', '-', string)
'a-b-c-d-e-f-g-h-i'

\b匹配单词字符和非单词字符。但\B\b相反,即两个单词字符和两个非单词字符匹配。

对于更一般的情况,

>>> re.sub(r'(?<=.)(?=.)', '-', string)
'a-b-c-d-e-f-g-h-i'

我永远不会让\B离开。 :)

>>> string = '(a)bc*d+e{f}gh[i]'
>>> re.sub(r'(?<!^)(\B|\b)(?!$)', '-', string)
'(-a-)-b-c-*-d-+-e-{-f-}-g-h-[-i-]'

(?<!^)负面的后视断言,匹配不会在线锚^的开头之前。 (\B|\b)匹配字边界或非字边界。 (?!$)否定前瞻声明匹配不会跟在行锚$的结尾。

答案 2 :(得分:5)

由于''.join(s)并不关心s是否由字母,空格或其他内容组成,因此使用\w\B的任何内容都会出错任何不是纯粹由“单词字符”组成的字符串。

您可以轻松地将nu11p01n73R's answer调整为不依赖于字词:

re.sub(r'(?<=.)(?=.)', '-', s)

Avinash Raj's answer不能;它依赖于\b\B的魔力,并且“字符边界”没有相应的魔术类,就像“字边界”一样。

当然,您可以只使用普通的捕获组和前瞻,而不是使用lookbehind和lookahead,这可能要简单得多:

re.sub(r'(.)(?=.)', r'\1-', s)