繁体   English   中英

正则表达式在Python中某个字符之前抢单词

[英]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 '匹配。

最后,如果要在normalgreen之间有所区别,则需要一个有效颜色的字典。 如果输入的内容中包含非水果字符串,例如topaz ,则水果名称也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM