Sat*_*tya 5 python regex string pandas
我有一个如下所示的数据框
name genre
satya |ACTION|DRAMA|IC|
satya |COMEDY|BIOPIC|SOCIAL|
abc |CLASSICAL|
xyz |ROMANCE|ACTION|DARMA|
def |DISCOVERY|SPORT|COMEDY|IC|
ghj |IC|
Run Code Online (Sandbox Code Playgroud)
现在我想查询数据框,以便我可以获得第 1,5 行和 6.i:ei 想要找到 |IC| 单独或与其他类型的任何组合。
到目前为止,我可以使用
df[df['genre'] == '|ACTION|DRAMA|IC|'] ######exact value yields row 1
Run Code Online (Sandbox Code Playgroud)
或字符串包含搜索
df[df['genre'].str.contains('IC')] ####yields row 1,2,3,5,6
# as BIOPIC has IC in that same for CLASSICAL also
Run Code Online (Sandbox Code Playgroud)
但我不要这两个。
#df[df['genre'].str.contains('|IC|')] #### row 6
# This also not satisfying my need as i am missing rows 1 and 5
Run Code Online (Sandbox Code Playgroud)
所以我的要求是找到具有 |IC| 的流派 在它们中。(我的字符串搜索失败,因为 python 将 '|' 视为 or 运算符)
有人建议一些 reg 或任何方法来做到这一点。感谢 ADv。
我认为您可以添加\到正则表达式进行转义,因为|without \被解释为OR:
'|'
A|B,其中 A 和 B 可以是任意 RE,创建一个匹配 A 或 B 的正则表达式。任意数量的 RE 可以用“|”分隔 通过这种方式。这也可以在组内使用(见下文)。扫描目标字符串时,RE 以“|”分隔 从左到右尝试。当一个模式完全匹配时,该分支被接受。这意味着一旦 A 匹配,B 将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,“|” 运营商从不贪婪。要匹配文字 '|',请使用 \|,或将其包含在字符类中,如 [|]。
print df['genre'].str.contains(u'\|IC\|')
0 True
1 False
2 False
3 False
4 True
5 True
Name: genre, dtype: bool
print df[df['genre'].str.contains(u'\|IC\|')]
name genre
0 satya |ACTION|DRAMA|IC|
4 def |DISCOVERY|SPORT|COMEDY|IC|
5 ghj |IC|
Run Code Online (Sandbox Code Playgroud)