繁体   English   中英

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

[英]Python: String match is not working with regular expression

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

我会做

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

output

   col
0  TC1
1  TC2
2  TC3

说明:我使用^$表示开始和结束,所以它只会检测哪里有完全匹配,即所谓的原始字符串,所以我可以在其中使用\d而无需额外的 escaping (有关更多信息,请参阅re docs )。 作为旁注"TC[1,2,3]"并没有按照你的想法做 - 如果你在[ ]中枚举字符,则没有要使用的分隔符,所以,被视为字符,所以

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

output

match

您可以使用 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 re
df = df[df.Col_3.apply(lambda x : re.match(r'^TC[\d{1}]$', x)).notna()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM