2015-11-15 3 views
0

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

У меня есть список слов:

arr = ["id",...] 

И у меня есть несколько строк:

str = "my_id" 
str1 = "Id_number" 
str2 = "my_id_rocks" 
str3 = "my_idea" 

Im пытаясь найти слово «идентификатор» в строках и включить в верхний регистр. но если id является частью слова в строке, то ничего не делать. Значение после того как я применить функцию больной получает:

str = "my_ID" 
str1 = "ID_number" 
str2 = "my_ID_rocks" 
str3 = "my_idea" 

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

До сих пор это то, что я есть, но это также заглавной idea => IDea, которые я не хочу:

def words_to_upper(str): 
    words = ["id"] 
    for word in words: 
     if word in str.lower(): 
      replace_word = re.compile(re.escape(word), re.IGNORECASE) 
      str = replace_word.sub(word.upper(), str) 
      break 
    return str 

Спасибо.

+0

@ Delgan, зачем это удалять? Мне нужно загладить слово. – MichaelR

+0

@ Delgan, извините, моя ошибка, я, конечно, должен сделать все слово в верхнем регистре. Я пытаюсь найти слово «id» в строках и включиться в верхний регистр. но если «id» является частью слова, тогда ничего не делайте. – MichaelR

+0

Хорошо, извините, я неправильно понял ваш вопрос. – Delgan

ответ

1

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

Ключевое слово вам нужно, предпросмотр и просмотром назад, увидеть в нижней части this section

import re 

teststrs = ["my_id", "Id_number", "my_id_rocks", "my_idea"] 

replace_with_upper = "id" 

def toUpper(match): 
    return match.group(1).upper() 

for test_me in teststrs: 
    test_me = re.sub("(?<![a-z])({})(?![a-z])".format(replace_with_upper), toUpper, test_me, flags=re.IGNORECASE) 
    print(test_me) 

(?<![a-z]) является отрицательным просмотром назад: «не совпадают, если этот шаблон совпадает с левой». Поэтому, если есть буква слева от "id", не совпадают. Это не происходит с вашими примерами, но я думаю, что вам тоже нужно это поведение.

(?![a-z]) - отрицательный взгляд: «не совпадают, если этот шаблон соответствует справа». Это предотвращает соответствие регулярного выражения "my_idea", потому что lookahead видит "e".

2

Вы можете использовать lookarounds, чтобы проверить, что нет цифры, буквы до и после id

(?i)(?<![a-z0-9])id(?![a-z0-9]) 

See demo at regex101

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