2014-12-13 3 views
4

Предположим, у меня есть строка string = 'abcdefghi', и я хочу, чтобы результат был 'a-b-c-d-e-f-g-h-i'. Я могу легко использовать '-'.join(string) и получить требуемый результат. Но что, если я хочу сделать то же самое с помощью регулярного выражения? Как я буду делать то же самое с помощью регулярного выражения?Альтернатива для регулярного выражения Python для соединения

Я спрашиваю, потому что я учусь использовать регулярное выражение и хотел бы знать, как думать в нем.

ответ

5

Поскольку ''.join(s) не волнует, если s состоит из букв, пробелов, или что-нибудь еще, что-нибудь с помощью \w или \B будет неправильно для любой строки, которая не состоит из чисто «символов слова».

Вы можете легко адаптировать nu11p01n73R's answer не полагаться на символы слова:

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

Но Avinash Raj's answer не может быть; он полагается на магию \b и \B, и для «границы символов» не существует соответствующего магического класса, как для «границы слова».

Конечно, вы могли бы использовать только нормальный захват группы и предпросмотр, вместо просмотра назад и опережающего просмотра, который, вероятно, намного проще:

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

Решения с использованием справочных обходными будет

>>> import re 
>>> str="abcdefghi" 
>>> re.sub(r'(?<=\w)(?=\w)', '-', str) 
'a-b-c-d-e-f-g-h-i' 
  • (?<=\w) утверждает, что письмо presceded по постиону

  • (?=\w) утверждает, что письмо сопровождается постионом

ИЛИ

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

Это лучше ... – georg

+1

я сделал то же самое только с '.' однако изменить' str' на 'text', чтобы вы не тенили встроенный. – jamylak

+0

'\ w' потребляется механизмом регулярного выражения так же, как' .'. И вы можете использовать '.' В lookahead, как '\ w'. – abarnert

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) соответствует границе слова или не-слова. (?!$) отрицательный lookahead утверждает, что за матчем не последует конец линейного якоря $.

+2

Да, но это не делает то же самое, что и '' - '. join() ', если вся строка не состоит из словных символов. – abarnert

+0

@abarnert yep, вы правы. Это специфично. Для более общего случая это будет' (? < =.) (? =.) ' –

Смежные вопросы