Python在字符串中间提取文本

问题描述

我想从文本中提取项目的名称

fg['Product'] = pd.Series([' 5 Guys Greasy Burger 3/5LB (24) [51656]','5 Guys Super StrawBerry Shake - (3/4) OZ (9) [5645654],'5 Guys Giant Loaded Double Cheese Burger 1/2LB Buns - 8Z Cups (22) [564654]'])

我需要在df列中按产品进行分析

fg['Product'] = 'Greasy Burger','Super StrawBerry Shake','Giant Loaded Double Cheese Burger'

我尝试了很多事情,但这使我最接近了。

fg['Product'] = fg['Product'].str.strip('5 Guys').str.replace(r'\[d+\]')

但是,这并不能使我到达那里。模式中的逻辑似乎是带状“ 5 Guys”,然后删除一个数字或第一个连字符“-”之后的所有内容。只是想不通。

解决方法

您可以将正则表达式r"5 Guys ([A-Za-z\s]*)"应用于每个条目,从而选择r"5 Guys "之后的包含所有字母字符和空格的组。如果其中也有带数字的名称,也许您必须找到更复杂的模式。我使用了在线正则表达式帮助程序来更轻松地创建模式(例如regex101)。

完整代码示例:

import pandas as pd
import re

regex_pattern = r"5 Guys ([A-Za-z\s]*)"

def find_name(full_string):
    match = re.search(regex_pattern,full_string)
    print(match[1])

s = pd.Series([' 5 Guys Greasy Burger 3/5LB (24) [51656]','5 Guys Super Strawberry Shake - (3/4) OZ (9) [5645654]','5 Guys Giant Loaded Double Cheese Burger 1/2LB Buns - 8Z Cups (22) [564654]'])
s.apply(lambda x: find_name(x))
,
r"5 Guys (.*?)(?=[0-9]|-)"

详细信息:

  • (.*?):第1组-尽可能少的字符
  • (?=[0-9]|-):条件(当我们遇到第一个数字或第一个连字符时)以停止正则表达式

Demo