[英]Regex to grab word before a certain character in python
我想从名称列中提取某个字符之前的单词,并将新的列添加为颜色
如果名称前没有颜色,则我想显示空字符串
我一直在尝试在比赛前提取单词。 例如,我有下表:
import pandas as pd
import re
data = ['red apple','green topaz','black grapes','white grapes']
df = pd.DataFrame(data, columns = ['Names'])
Names
red apple
green apple
black grapes
white grapes
normal apples
red apple
下面的代码我是treid 我geeting部分获取输出
df['Names'].apply(lambda x: ' '.join(re.findall(r'(\w+)\s+apple', x)))
df['Names'].apply(lambda x: ' '.join(re.findall(r'(\w+)\s+apple|grapes', x)))
所需的输出:
Names color
red apple red
green apple green
black grapes black
white grapes white
normal apples
red apple red
请帮我解决这个问题
我找到了解决方案:给我一个color_column,例如['red','green','black','white','']
import re
data = ['red apple','green topaz','black grapes','white grapes','apples']
colors_column = list(map(lambda x: ' '.join(re.findall(r'(\S\w+)\s+\w+', x)) ,data))
不一定是个绝妙的把戏,但这似乎可行:
((re.search('(\w*) (apple|grape)',a)) or ['',''])[1]
简短地说,您搜索的是苹果或葡萄之前的第一个单词,但是如果没有匹配项,则返回None
,这是错误的。 因此,您可以使用或使用空字符串列表,但是由于要获取匹配表达式的第一个元素(索引1),因此我使用了空字符串的两个元素列表(在那里获取了第二个元素)。
一种解决方案是删除水果名称以获得颜色:
def remove_fruit_name(description):
return re.sub(r"apple|grapes", "", description)
df['Colors'] = df['Names'].apply(remove_fruit_name)
如果您有很多行,则编译正则表达式可能会更快:
fruit_pattern = re.compile(r"apple|grapes")
def remove_fruit_name(description):
return fruit_pattern.sub("", description)
另一个解决方案是使用先行断言 ,它(可能)要快一些,但是代码要复杂一些:
# That may be useful to have a set of fruits:
valid_fruit_names = {"apple", "grapes"}
any_fruit_pattern = '|'.join(valid_fruit_names)
fruit_pattern = re.compile(f"(\w*)\s*(?={any_fruit_pattern})")
def remove_fruit_name(description):
match = fruit_pattern.search(description)
if match:
return match.groups()[0]
return description
df['Colors'] = df['Names'].apply(remove_fruit_name)
这是文档中引用的前瞻性示例:
(?=...)
如果
...
下一个匹配,则匹配,但不使用任何字符串。 这称为先行断言 。 例如,仅当Isaac (?=Asimov)
后跟'Asimov'
它才会与'Isaac '
匹配。
最后,如果要在normal
和green
之间有所区别,则需要一个有效颜色的字典。 如果输入的内容中包含非水果字符串,例如topaz
,则水果名称也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.