68553


Pythonにて、データ分析の勉強をしております。(Python初学者)

前処理の段階で、正規表現を使用して商品名を統一したいです。  
実際の、商品名をみると、以下のように汚いです。

・あらびきソーセージ-135Ｇ/6本入り-315円  
・あらびきソーセージ-135Ｇ/6本入り-345円  
・あらびきソーセージ-135Ｇ/6本入り-355円

全部、uniqueな「あらびきソーセージ」という同じ商品ですが、消費税等の変化により、商品名が別物としてあらわれている現状です。

「やりたいこと」  
全て、「あらびきソーセージ」にしたい！！

[code]

    data["商品名"] = data["商品名"].str.replace(" 正規表現 ", "あらびきソーセージ")
    
[/code]

どのような正規表現をかけば、全てあらびきソーセージに変更できるのでしょうか？？

よろしくお願いいたします。


CC BY-SA 4.0
2020-07-13T09:17:40.377
68550
2020-07-13T10:30:22.090
2020-07-13T09:24:03.423
32986
35449
question
python 正規表現
前処理の段階で、正規表現を使用して商品名を統一したい


サンプルコードの項番1のように、特定の文字列を部分的に含む商品名を置換したいだけならば、1行のコードで置換することができます。

サンプルコードの項番2のように、正規表現を使いたい場合は[`re.sub`](https://docs.python.org/ja/3/library/re.html#re.sub)で置換することができます。  
`r"\g<1>"`はグループ番号を表し、1つ目の引数で(括弧)でくくられたグループに該当する文字列を意味します。

サンプルコードの項番3のように、pandas.DataFrameの要素を正規表現で置換したい場合は、`replace`の[`regex`引数をTrueにする](https://note.nkmk.me/python-
pandas-replace/)ことで置換することができます。  
こちらは質問文でpandasを使っていると推測されたので書き足しています。pandasをpip installしていないとエラーになります。

[code]

    items = [
        "あらびきソーセージ-135Ｇ/6本入り-315円",
        "あらびきソーセージ-135Ｇ/6本入り-345円",
        "あらびきソーセージ-135Ｇ/6本入り-355円",
        "薫香あらびきソーセージ-135Ｇ/6本入り-455円",
        "あらさがしソーセージ-135Ｇ/6本入り-355円",
    ]
    
    # 1. 内包表記で"あらびきソーセージ"を含む表現を"あらびきソーセージ"に置換する
    n = ["あらびきソーセージ" if "あらびきソーセージ" in s else s for s in items]
    print(n) # ['あらびきソーセージ', 'あらびきソーセージ', 'あらびきソーセージ', 'あらびきソーセージ', 'あらさがしソーセージ-135Ｇ/6本入り-355円']
    
    # 2. 正規表現で"あらびきソーセージ"を含む表現を"あらびきソーセージ"に置換する
    import re
    
    n = []
    for s in items:
        n.append(re.sub("^.*(あらびきソーセージ).*$", r"\g<1>", s))
    
    print(n) # ['あらびきソーセージ', 'あらびきソーセージ', 'あらびきソーセージ', 'あらびきソーセージ', 'あらさがしソーセージ-135Ｇ/6本入り-355円']
    
    # 3. データフレームで正規表現置換する
    import pandas as pd
    
    json = '''
    [
        {"id": 1, "商品名": "あらびきソーセージ-135Ｇ/6本入り-315円"},
        {"id": 2, "商品名": "あらびきソーセージ-135Ｇ/6本入り-345円"},
        {"id": 3, "商品名": "あらびきソーセージ-135Ｇ/6本入り-355円"},
        {"id": 4, "商品名": "薫香あらびきソーセージ-135Ｇ/6本入り-455円"},
        {"id": 5, "商品名": "あらさがしソーセージ-135Ｇ/6本入り-355円"}
    ]
    '''
    
    data = pd.read_json(json)
    data = data.replace("^.*(あらびきソーセージ).*$", r"\g<1>", regex=True)
    print(data)
    
    """ 
       id                        商品名
    0   1                  あらびきソーセージ
    1   2                  あらびきソーセージ
    2   3                  あらびきソーセージ
    3   4                  あらびきソーセージ
    4   5  あらさがしソーセージ-135Ｇ/6本入り-355円
    """ 
    
[/code]


CC BY-SA 4.0
2020-07-13T10:30:22.090
68553
2020-07-13T10:30:22.090
9820
68550
answer