【问题标题】:Python Pandas Extract word from column that contains String with RegexPython Pandas 从包含使用正则表达式的字符串的列中提取单词
【发布时间】:2021-04-19 17:23:28
【问题描述】:

我有这个数据框(列是字符串):

        ORF                                             ORFDesc
3     b1731              succinate-semialdehyde dehydrogenase
4      b234              succinate-semialdehyde dehydrogenase
24    b2780                             L-alanine dehydrogenase
27     b753          methylmalmonate semialdehyde dehydrogenase
29    b1187               pyrroline-5-carboxylate dehydrogenase
...............................................................                                               
1922  b1124                         probable epoxide hydrolase 
1923  b2214                         probable epoxide hydrolase 
1924  b3670                          probable epoxide hydrolase
1925   b134                          probable epoxide hydrolase
2382  b2579    1,3,4,6-tetrachloro-1,4-cyclohexadiene hydrolase

我需要为带有 'ORFDesc' 的行获取 'ORF',其中包含带有“hydro”但仅包含 13 个字符的单词。我解释一下,字长必须是 13 个字符,而不是整个描述。

我正在使用

df['IDClass'][df['ORFDesc'].str.contains("hydro", na=False)]

为了匹配包含“hydro”的行,但我需要拒绝长度为 != 13 的行。

我想使用正则表达式,这样我就可以创建一个新的列“单词”,例如:

ORF                                             ORFDesc                word
3     b1731              succinate-semialdehyde dehydrogenase          dehydrogenase
4      b234              succinate-semialdehyde dehydrogenase          dehydrogenase
24    b2780                             L-alanine dehydrogenase        dehydrogenase
27     b753          methylmalmonate semialdehyde dehydrogenase           .
29    b1187               pyrroline-5-carboxylate dehydrogenase             .
...............................................................                                               
1922  b1124                         probable epoxide hydrolase         hydrolase 
1923  b2214                         probable epoxide hydrolase         hydrolase 
1924  b3670                          probable epoxide hydrolase        ....
1925   b134                          probable epoxide hydrolase         ..
2382  b2579    1,3,4,6-tetrachloro-1,4-cyclohexadiene hydrolase        .

然后可以通过使用“word”列中的长度来丢弃行。

会是什么模式?

编辑:

我试过了,但还是不行:

pattern = '\b(?=\w*hydro)\w+\b'

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    如果您正在寻找一个布尔系列来判断它是否匹配,您可以使用\b(?=\w{13}\b)(?=\w*hydro),它将判断单词是否为 13 个字符并包含 hydro 模式:

    df.ORFDesc.str.contains(r'\b(?=\w{13}\b)(?=\w*hydro)')
    
    #3        True
    #4        True
    #24       True
    #27       True
    #29       True
    #1922    False
    #1923    False
    #1924    False
    #1925    False
    #2382    False
    #Name: ORFDesc, dtype: bool
    

    【讨论】:

      【解决方案2】:

      你可以使用

      \b(?=\w{13}\b)\w*hydro
      

      regex demo

      详情

      • \b - 单词边界
      • (?=\w{13}\b) - 正向前瞻,要求 13 个单词字符紧跟在当前位置的右侧,后跟单词边界
      • \w*hydro - 零个或多个单词字符,然后是 hydro

      Python 代码:

      df['ORF'][df['ORFDesc'].str.contains(r"\b(?=\w{13}\b)\w*hydro", na=False)]
      

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 2019-03-18
        • 1970-01-01
        相关资源
        最近更新 更多