Python:字符串匹配不适用于正则表达式

Python:字符串匹配不适用于正则表达式,python,dataframe,Python,Dataframe,我们试图从一个列中提取行,该列的值严格包含以下值之一[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

我们试图从一个列中提取行,该列的值严格包含以下值之一
[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行,而是返回所有行。我们不明白为什么它是错误的。

您可以使用str.contains-

df = df[df.Col_3.str.contains(pat = r'^TC[\d{1}]$')]
或者通过str.match-

df = df[df.Col_3.str.match(pat = r'^TC[\d{1}]$')]
或者通过str.fullmatch-

df = df[df.Col_3.str.fullmatch(pat = r'^TC[\d{1}]')]
或通过应用(慢速)-

我愿意

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
match
说明:我使用了表示开始和结束的
^
$
,因此它将只检测存在完全匹配的所谓原始字符串的位置,这样我就可以在其中使用
\d
,而无需额外转义(有关更多信息,请参阅)。作为旁注,
“TC[1,2,3]”
并不是你想的那样-如果你在
[
]
中枚举字符,就没有可以使用的分隔符,所以
被视为字符,所以

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

   col
0  TC1
1  TC2
2  TC3
match

这回答了你的问题吗?您也可以使用
.fullmatch()
df[“col”].str.fullmatch(r“TC\d”)
将不需要
^
$
,尽管它们本质上是相同的。OP特别提到
str.contains
不是一个选项(尽管如果使用
^
$
),ProblemsLoop更新了我的答案