选项 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 转换为列表。