Python正则后行与负后行断言困惑及Pandas字符串提取需求
我来帮你搞定这个需求!要从Pandas DataFrame中提取斜杠右侧的rabbit相关术语,同时排除掉右侧字符串里rabbit前面带有jack(不管中间有没有间隔字符)的情况,我们可以结合Pandas的字符串处理工具和正则表达式来实现,下面是具体步骤和代码示例:
解决方案步骤
1. 提取斜杠右侧的字符串内容
首先我们需要把目标列的字符串按/分割,单独取出右侧的部分。可以用Pandas的str.split()方法来快速实现:
import pandas as pd # 先构造一个测试用的DataFrame(你可以替换成自己的真实数据) df = pd.DataFrame({ 'target_col': [ 'animal/white rabbit', 'pet/jack rabbit', 'wild/jack and rabbit', 'zoo/rabbit hole', 'farm/jackrabbit', 'park/brown rabbit' ] }) # 分割字符串,提取斜杠右侧的内容,存为新列 df['right_side'] = df['target_col'].str.split('/', expand=True)[1]
2. 筛选并提取符合条件的rabbit术语
接下来我们需要筛选出right_side列中包含rabbit,且rabbit前面没有jack(无论是否有间隔)的内容。这里用负向预查正则表达式来精准匹配:
正则表达式:^(?!.*jack.*rabbit).*rabbit.*$
^:匹配字符串的开头(?!.*jack.*rabbit):负向预查,意思是"整个字符串中不存在'任意字符+jack+任意字符+rabbit'的序列".*rabbit.*:确保字符串中包含rabbit- 可以加上
case=False参数来忽略大小写(如果你的数据里有大小写混合的情况)
然后用str.contains()来筛选,再用where()提取符合条件的内容:
# 定义匹配规则 pattern = r'^(?!.*jack.*rabbit).*rabbit.*$' # 提取符合条件的rabbit术语,不符合的设为None df['valid_rabbit_term'] = df['right_side'].where(df['right_side'].str.contains(pattern, case=False), None)
最终结果
运行上面的代码后,你的DataFrame会变成这样:
| target_col | right_side | valid_rabbit_term |
|---|---|---|
| animal/white rabbit | white rabbit | white rabbit |
| pet/jack rabbit | jack rabbit | None |
| wild/jack and rabbit | jack and rabbit | None |
| zoo/rabbit hole | rabbit hole | rabbit hole |
| farm/jackrabbit | jackrabbit | None |
| park/brown rabbit | brown rabbit | brown rabbit |
如果你的需求是只提取rabbit相关的核心术语(比如只保留"rabbit"或带修饰的部分,而不是整个右侧字符串),可以调整正则为r'(?<!jack.*)\brabbit\b.*',不过根据你的描述,上面的方案应该已经能满足需求啦。
内容的提问来源于stack exchange,提问作者user1718097
相关产品推荐
相关产品推荐

