2015-12-10 4 views
1

Мне нужно выполнить нечеткий поиск подстроки в строке и заменить эту часть. Например:Python нечеткий поиск и замена

str_a = "Alabama" 
str_b = "REPLACED" 
orig_str = "Flabama is a state located in the southeastern region of the United States." 
print(fuzzy_replace(str_a, str_b, orig_str)) # fuzzy_replace code should be implemented 
# Output: REPLACED is a state located in the southeastern region of the United States. 

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

+1

Будет ли это всегда одно слово? Если да, мы можем разделить пространство и заменить его, если желаемое соотношение пройдено. – nehemiah

+0

@itsneo Хорошая идея, но она может содержать пробелы :( – svfat

+1

Давайте подделывать еще больше ... Скажем, у нас есть строка для замены 'str_a =" Алабама - это «', которая имеет три слова. Теперь повторите процедуру 'orig_str' с 'len (str_a)' словами. Я имею в виду, беру 3 за раз и перебираю его до конца, что будет сложнее O (n). Теперь замените, если отношение пройдет. – nehemiah

ответ

3

Попробуйте это ..

from fuzzywuzzy import fuzz 

def fuzzy_replace(str_a, str_b, orig_str): 
    l = len(str_a.split()) # Length to read orig_str chunk by chunk 
    splitted = orig_str.split() 
    for i in range(len(splitted)-l+1): 
     test = " ".join(splitted[i:i+l]) 
     if fuzz.ratio(str_a, test) > 75: #Using fuzzwuzzy library to test ratio 
      before = " ".join(splitted[:i]) 
      after = " ".join(splitted[i+1:]) 
      return before+" "+str_b+" "+after #Output will be sandwich of these three strings 

str_a = "Alabama is a" 
str_b = "REPLACED" 
orig_str = "Flabama is a state located in the southeastern region of the United States." 
print fuzzy_replace(str_a, str_b, orig_str) 

Печатается

REPLACED state located in the southeastern region of the United States. 
Смежные вопросы