python - 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 行,而是返回所有行。我们不明白为什么它是错误的。
解决方案
我会做
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
推荐阅读
- php - PHP - 达到一定计数后递增数组
- google-cloud-platform - 如何在 GCE.. 中使用 YAML 语法创建磁盘快照?
- android - Android - queryPurchaseHistoryAsync 购买列表在其他设备上为空
- c# - 如何在 Nest 中使用属性来表示关键字数组
- node.js - NodeJS 快递:request.query 与 request.body
- java - java.lang.NoSuchMethodException: org.apache.catalina.startup.Catalina.setAwait(boolean)
- c# - Google.Cloud.Datastore.V1 中的密钥是什么
- python - 相同的 NN 架构在张量流和 keras 中提供不同的精度
- elasticsearch - 在 Elasticsearch 服务器中配置保持活动超时
- android - 用户拒绝 Android 权限时的白屏