假设我有一个字符串string = 'abcdefghi'
,我希望输出为'a-b-c-d-e-f-g-h-i'
我可以轻松使用'-'.join(string)
并获得所需的输出。但是,如果我想使用正则表达式做同样的事情呢?我如何使用正则表达式做同样的事情?
我在问,因为我正在学习使用正则表达式,并想知道如何思考它。
答案 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)