提取字母python的中间单词

时间:2018-01-11 07:03:05

标签: python string pandas split

我有一个名为df的pandas数据框,看起来像这样

Name
------
Mike
Noel
Kim
Anna
Luke
joseph
joe

如何仅列出包含单词' n'的名称?或者' k'在名字的中间。不是第一个字母,也不是最后一个字母。结果是

namelist = [Mike, Anna, Luke]

3 个答案:

答案 0 :(得分:4)

选项1
你可以使用str.contains -

这样做
df.loc[df.Name.str.contains(r'\w[nk]\w'), 'Name'].tolist()
['Mike', 'Anna', 'Luke']

详细
首先,正则表达式 -

\w      # any alpha-numeric char
[nk]    # character class; letters "n" and "k"
\w      # any alpha-numeric char

这确保,如果单词“n”或“k”开头或结尾(不包含在单词的中间),则不会拾取(“n”或“k”必须在两边都有东西。

一个类似的正则表达式,匹配任何周围的字符(除了字母数字字符)将是 -

r'.[nk].'

或者,如果你想要一个与中间带“n”或“k”的字符串匹配的正则表达式,以及末尾除“n”和“k”之外的任何字符串,请使用 -

r'^[^nk].*[nk].*[^nk]$' 

str.contains来电的输出 -

df.Name.str.contains(r'\w[nk]\w')

0     True
1    False
2    False
3     True
4     True
5    False
6    False
Name: Name, dtype: bool

使用loc -

输出切片操作
df.loc[df.Name.str.contains(r'\w[nk]\w'), 'Name']

0    Mike
3    Anna
4    Luke
Name: Name, dtype: object

现在,调用pd.Series.tolist会为您提供名称列表。

选项2
使用str.findall -

的另一个选项
df.Name.str.findall(r'^.*\w[nk]\w.*$').str[0].dropna().tolist()
['Mike', 'Anna', 'Luke']

哪个与第一个类似,但有些不同。

详细
首先,findall调用的输出 - 匹配列表。正则表达式模式与上面相同,但如果找到中间的模式,则略微修改以捕获整个字符串。

df.Name.str.findall(r'^.*\w[nk]\w.*$')

0    [Mike]
1        []
2        []
3    [Anna]
4    [Luke]
5        []
6        []
Name: Name, dtype: object

从每个列表中获取第一个元素。空列表返回NaN,随后将其删除 -

df.Name.str.findall(r'.*\w[nk]\w.*').str[0].dropna()

0    Mike
3    Anna
4    Luke
Name: Name, dtype: object

从那里,使用pd.Series.tolist转换为列表。

答案 1 :(得分:1)

使用changing KO labelstr[1:-1]删除第一个和最后一个字符,然后按boolean indexing进行检查:

L = df.loc[df['Name'].str[1:-1].str.contains('n|k'), 'Name'].tolist()
print (L)
['Mike', 'Anna', 'Luke']

编辑:如果有必要,还会排除第一个和最后一个nk值:

m = ~df['Name'].str[0].str.lower().isin(['n','k']) &  \
    ~df['Name'].str[-1].str.lower().isin(['n','k']) & \
    df['Name'].str[1:-1].str.contains('n|k')

df = df.loc[m, 'Name'].tolist()
print (df)
['Mike', 'Anna', 'Luke']

答案 2 :(得分:0)

可以在这里使用列表理解。下面的代码还确保不选择像'nnkk'这样的名称(其中n和/或k都位于中间以及一端或两端)。此外,下面和上面的案例都在这里管理:

namelist = df.Name.tolist()              # get all names in a list
outlist = [ n
    for n in namelist
    if n[0].upper() not in ['N','K']     # conditions
       and n[-1].upper() not in ['N','K'] 
       and (n.upper().find("N") >=0 
            or n.upper().find("K") >=0) ]

print(outlist)

输出:

['Mike', 'Anna', 'Luke']