首页 > 解决方案 > Python:字符串匹配不适用于正则表达式

问题描述

我们正在尝试从其值严格包含以下值之一的列中提取行[TC1, TC2, TC3]。诀窍是某些行还包含以下值TC12,TC13等。我们不想提取它们。在这里使用str.contains不是一个选项。

Col_1 Col_2 Col_3
  1    A     TC1
  2    B     TC2
  3    C     TC3
  4    D     TC12
  5    D     TC15
  6    D     TC16

Col_1 Col_2 Col_3
  1    A     TC1
  2    B     TC2
  3    C     TC3

我们使用了以下命令:

df1 = df.loc[df1['Col_3'].str.match("TC\d{1}")]
df1 = df.loc[df1['Col_3'].str.match("TC[1-3]{1}")]
df1 = df.loc[df1['Col_3'].str.match("TC[1,2,3]")]

但问题是这不起作用。它不是返回前 3 行,而是返回所有行。我们不明白为什么它是错误的。

标签: pythondataframe

解决方案


我会做

import pandas as pd
df = pd.DataFrame({"col":['TC1','TC2','TC3','TC12','TC15','TC16']})
print(df[df["col"].str.match(r"^TC\d$")])

输出

   col
0  TC1
1  TC2
2  TC3

说明:我使用了^and $,它的意思是开始和结束,所以它只会检测到哪里有完全匹配,即所谓的原始字符串,所以我可以\d在它里面使用而不需要额外的转义(有关更多信息,请参阅re docs)。由于旁注"TC[1,2,3]"没有按照您的想法做 - 如果您在里面枚举字符[ ],则没有要使用的分隔符,所以,被视为字符,所以

import re
if(re.match("TC[1,2,3]", "TC,")):
   print("match")
else:
   print("no match")

输出

match

推荐阅读