在列中查找字符串的精确正则表达式匹配

时间:2018-02-05 11:04:41

标签: python regex string pandas

这是我的Dataframe:

                         entityId  delta_approved_clockout
 (ID: 10)              247333605                      0.0  
  (ID: 20)               36738870                      0.0  
  (ID: 40)             4668036427                      0.0  
  (ID: 50)             1918647972                      0.0  
  (ID: 60)             4323165902                  44125.0  
  (ID: 80)              145512255                      0.0  
 Assigned (ID: 30)       42050340                      0.0  
 Assigned (ID: 40)   130880371376                      0.0  
 Assigning (ID: 30)    1095844753                      0.0  
 Cancelled (ID: 40)        937280                      0.0  
 Cancelled (ID: 80)   16857720813                      0.0  
 Planned (ID: 20)      9060392597                      0.0  
 Planning (ID: 10)   108484297031                      0.0  
 Processed (ID: 70)  133289880880                      0.0  
 Revoked (ID: 50)      2411903072                      0.0  
 Writing (ID: 50)    146408550024                      0.0  
 Written (ID: 60)    139458227923                1018230.0  

我希望结果只打印'(ID:10)'的完全正则表达式匹配,使用此行我的输入包括' Planning(ID:10)',这不是我需要的完全匹配。这些是总结的结果:

                        entityId  delta_approved_clockout  
last_status                                                
  (ID: 10)             247333605                      0.0  
 Planning (ID: 10)  108484297031                      0.0  

print input_data[input_data['last_status'].str.contains(r'(?<!\S)\(ID: 10\)(?!\S)', na=False)]

我还尝试过使用0结果的正则表达式代码,例如:

print input_data[input_data['last_status'].str.contains(r' ^(\(ID: \d+\))$', na=False)]

print input_data[input_data['last_status'].str.contains(r'^(\(ID: 10\))$', na=False)]

也许我不能完全理解正则表达式,写正则表达式的正确方法是什么?提前谢谢。

4 个答案:

答案 0 :(得分:1)

如果您想获得整行,可以将正则表达式更新为^\s*\(ID: 10\).*$

要捕获群组中的(ID: 10),您可以尝试^\s*(\(ID:\s*10\)).*$

答案 1 :(得分:1)

您可以使用

r'^\s*\(ID:\s*\d+\)\s*$'

请参阅the documentation

模式匹配:

  • ^ - 字符串开头
  • \s* - 零个或多个(*)空白字符
  • \(ID: - (ID:子字符串
  • \s* - 零个或多个(*)空白字符
  • \d+ - 1+位数
  • \) - )字符
  • \s* - 零个或多个(*)空白字符
  • $ - 字符串结束。

答案 2 :(得分:1)

正则表达式^\s*\(ID:\s10\)[^\r\n]+

详细说明:

  • ^在行的开头断言位置
  • \s匹配任何空格字符
  • *零和无限时间之间的匹配
  • [^]匹配列表中不存在的单个字符
  • +在一个时间和无限时间之间匹配
  • \r\n匹配回车符和换行符(换行符)

Python代码

dataframe = """ (ID: 20)              247333605                      0.0  
  (ID: 50)               36738870                      0.0  
  (ID: 40)             4668036427                      0.0  
  (ID: 50)             1918647972                      0.0  
  (ID: 60)             4323165902                  44125.0  
  (ID: 10)              145512255                      0.0  
 Assigned (ID: 30)       42050340                      0.0  
 Assigned (ID: 40)   130880371376                      0.0  
 Assigning (ID: 30)    1095844753                      0.0  
 Cancelled (ID: 40)        937280                      0.0  
 Cancelled (ID: 80)   16857720813                      0.0  
 Planned (ID: 20)      9060392597                      0.0  
 Planning (ID: 10)   108484297031                      0.0  
 Processed (ID: 70)  133289880880                      0.0  
 Revoked (ID: 50)      2411903072                      0.0  
 Writing (ID: 50)    146408550024                      0.0  
 Written (ID: 60)    139458227923                1018230.0 """

def ID(id, data):
        return re.findall(r'^\s*\(ID:\s%s\)[^\r\n]+' % id, data, re.MULTILINE)

ID(10, dataframe) >> ['  (ID: 10)              145512255                      0.0  ']

答案 3 :(得分:0)

这应该有效:

input_data = input_data[(input_data['last_status'] == '(ID: 10)')]