2015-04-06 2 views
2

Как заменить полное слово abc.def на начало, середина и конец строки, но не заменить текст как abc.def.au или d.abc.def:Match полное слово в начальной, средней и в конце строки

line = "abc.def abc.def.au abc.def d.abc.def abc.def" 
new_line = re.sub("abc.def", "-----", line) 
print(line) 
print(new_line) 

Токовый выход:

abc.def abc.def.au abc.def d.abc.def abc.def 
----- -----.au ----- d.----- ----- 

Ожидаемый результат:

abc.def abc.def.au abc.def d.abc.def abc.def 
----- abc.def.au ----- d.abc.def ----- 

Можно ли это сделать в одном re.sub()?

ответ

3

Вы можете использовать линейные якоря. ^ и $ матчей только в начало строки и конца строки, соответственно, так что вы можете использовать их, как например:

line = "abc.def abc.def.au abc.def d.abc.def abc.def" 
new_line = re.sub(r"^abc\.def|abc\.def$", "-----", line) 
print(line) 
print(new_line) 

Обратите внимание, что безопаснее сырых строки регулярных выражений, и избежать . характера (который соответствует почти любой символ в регулярном выражении).


Если вы хотите заменить только целые слова, которые вы будете нуждаться в некоторых lookarounds вместо:

line = "abc.def abc.def.au abc.def d.abc.def abc.def" 
new_line = re.sub(r"(?<!\S)abc\.def(?!\S)", "-----", line) 
print(line) 
print(new_line) 

ideone demo

(?<!\S) предотвратит матч, если abc.def предшествует некосмическими персонаж.

(?!\S) предотвратит совпадение, если abc.def следует за несимметричным символом.

+1

Он также хочет заменить полное слово посредине строки –

+0

@RainLee Я не уверен, как я пропустил 'middle', но * string * обычно это целая строка/текст. Я увидел «средний» в вопросе позже и добавил его. – Jerry

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