2015-08-27 3 views
1

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

x = "Apple iPhone 6(Silver, 16 GB)" 
y = "Apple iPhone 6 64 GB GSM Mobile Phone (Silver)" 

Approach 1: 
tmp_body = " ".join("".join([" " if ch in string.punctuation else ch.lower() for ch in y]).split()) 
tmp_body_1 = " ".join("".join([" " if ch in string.punctuation else ch.lower() for ch in x]).split()) 
if tmp_body in tmp_body_1: 
    print "true" 

В моей задаче х всегда будет основой строка и у изменится

Approach 2: 
Fuzzy logic --> But was not getting good results through it 

Approach 3: 
Using regex which I don't know 

Я до сих пор выяснить пути ее решения с регулярным выражением.

  1. Удаление специальных символов из обоих базы и входящей строки
  2. Совпадение с GB и Color
  3. Нарезка GB от числа для хорошего согласования

Эти вещи у меня есть разобрался.

+0

, что Ваш входной выход? –

+0

'x' будет моей базой, и' y' изменится. –

+1

Regex должен использоваться только для ввода, который вам известен в формате. Это плохо подходит для этого варианта использования. – nhahtdh

ответ

1

Как насчет следующего подхода. Разделите каждый на слова, запишите каждое слово и сохраните в наборе. x должно быть подмножеством y. Таким образом, для вашего примера она не будет выполнена в 16 не соответствует 64:

x = "Apple iPhone 6(Silver, 16 GB)" 
y = "Apple iPhone 6 64 GB GSM Mobile Phone (Silver)" 

set_x = set([item.lower() for item in re.findall("([a-zA-Z0-9]+)", x)]) 
set_y = set([item.lower() for item in re.findall("([a-zA-Z0-9]+)", y)]) 

print set_x 
print set_y 

print set_x.issubset(set_y) 

Давать следующие результаты:

set(['apple', '16', 'gb', '6', 'silver', 'iphone']) 
set(['apple', 'mobile', 'phone', '64', 'gb', '6', 'gsm', 'silver', 'iphone']) 
False 

Если 64 изменяется на 16, то вы получите:

set(['apple', '16', 'gb', '6', 'silver', 'iphone']) 
set(['apple', '16', 'mobile', 'phone', 'gb', '6', 'gsm', 'silver', 'iphone']) 
True 
+0

Спасибо, что это было то, что мне нужно ... –

+0

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

+0

Какой тип db вы используете? Я могу сказать вам в mongodb. Этот результат не эффективен, как я хочу, но работает хорошо, и миллион записей не проблема, работая над этой теорией на них @RajendraKhabiya –

1

Похоже, вы пытаетесь сделать самую длинную общую подстроку здесь из неизвестных строк. Find common substring between two strings

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

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

capacity = re.search(r'(\d+)\s*GB', useragent) 
model = re.search(r'Apple iPhone ([A-Za-z0-9]+)', useragent) 

Эти шаблоны не будут иметь для вас никакого смысла, если вы не прочитаете документацию по модулю Python. В основном, для емкости я ищу 1 или более цифр, за которыми следуют 0 или более пробелов, за которыми следует GB. Если я нахожу совпадение, результатом является объект совпадения, и я могу получить пропускную способность с помощью match.group(). Аналогичная история для поиска версии iPhone, хотя мой шаблон не работает для «6 Plus».

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

+0

Это, похоже, не решает мою проблему, потому что выход, который я получаю, это яблочный iphone 6, но, с другой стороны, я хочу совместить 16-гигабайтный и серебряный цвет как awell –

+0

. Вы совершенно правы. –

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