Python 提取字符串中间的文本
Python Extract text in middle of string
我想从文本中提取项目的名称。
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]|-)"
详情:
(.*?)
: Group1 - 尽可能少的任意字符
(?=[0-9]|-)
:停止正则表达式的条件(当我们遇到第一个数字或第一个连字符时)
我想从文本中提取项目的名称。
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]|-)"
详情:
(.*?)
: Group1 - 尽可能少的任意字符(?=[0-9]|-)
:停止正则表达式的条件(当我们遇到第一个数字或第一个连字符时)