Проверить строку для конкретного формата подстроки, как ..? - PullRequest
1 голос
/ 18 апреля 2019

две строки.Имя моего товара:

Название парфюма EDT 50ml

И название товара конкурента:

Парфюмерия другого имени EDP 60ml

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

"**ml" in competitors_name

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

Спасибо

ОБНОВЛЕНИЕ

'ml' не всегда в конце строки.Это может выглядеть так

Parfume еще одно замечательное имя 60 мл EDP

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

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

import re

def same_measurement(my_item, competitor_item, unit="ml"):
    matcher = re.compile(r".*?(\d+){}".format(unit))
    my_match = matcher.match(my_item)
    competitor_match = matcher.match(competitor_item)
    return my_match and competitor_match and my_match.group(1) == competitor_match.group(1)

my_item = "Parfume name EDT 50ml"
competitor_item = "Parfume another name EDP 50ml"
assert same_measurement(my_item, competitor_item)

my_item = "Parfume name EDT 50ml"
competitor_item = "Parfume another name EDP 60ml"
assert not same_measurement(my_item, competitor_item)
1 голос
/ 18 апреля 2019

Вы можете использовать библиотеку Python Regex, чтобы выбрать значения «xxml» для каждой строки данных, а затем выполнить некоторую логику, чтобы проверить, совпадают ли они.

import re

data_rows = [["Parfume name EDT", "Parfume another name EDP 50ml"]]

for data_pairs in data_rows:
    my_ml = None
    comp_ml = None

    # Check for my ml matches and set value
    my_ml_matches = re.search(r'(\d{1,3}[Mm][Ll])', data_pairs[0])
    if my_ml_matches != None:
        my_ml = my_ml_matches[0]
    else:
        print("my_ml has no ml")

    # Check for comp ml matches and set value
    comp_ml_matches = re.search(r'(\d{1,3}[Mm][Ll])', data_pairs[1])     
    if comp_ml_matches != None:
        comp_ml = comp_ml_matches[0]
    else:
        print("comp_ml has no ml")

    # Print outputs
    if (my_ml != None) and (comp_ml != None):
        if my_ml == comp_ml:
            print("my_ml: {0} == comp_ml: {1}".format(my_ml, comp_ml))
        else:
            print("my_ml: {0} != comp_ml: {1}".format(my_ml, comp_ml))

Где data_rows = каждая строка в наборе данных

Где data_pairs = {your_item_name, Competitor_item_name}

0 голосов
/ 18 апреля 2019

Вы можете использовать лямбда-функцию для этого.

import pandas as pd
import re
d = {
    'Us':
        ['Parfume one 50ml', 'Parfume two 100ml'],
    'Competitor':
        ['Parfume uno 50ml', 'Parfume dos 200ml']
}
df = pd.DataFrame(data=d)

df['Eq'] = df.apply(lambda x : 'Yes' if re.search(r'(\d+)ml', x['Us']).group(1) == re.search(r'(\d+)ml', x['Competitor']).group(1) else "No", axis = 1)

Результат:

enter image description here

Не имеет значения,'ml' находится в конце строки.

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