我的目标是排除以No为前缀的行,例如,我对单词commerce感兴趣,然后我必须保留所有行包含commerce,并排除no commerce。我在找一个通用的解决方案
data = {
'description':[
'Commerce foo',
'foo commercial',
'foo no commercial',
'foo commercial boo',
'No commerce',
'foo restaurant',
'boo no restaurant']
}
df = pd.DataFrame(data)
______________________
| description |
__________________________
| 0 | Commerce foo |
| 1 | foo commercial |
| 2 | foo no commercial |
| 3 | foo commercial boo |
| 4 | No commerce |
| 5 | foo restaurant |
| 6 | boo no restaurant |
__________________________我试过(不工作)
search = ['restaurant', 'commerce', 'commercial']
df['description'].str.findall(f'̂̂̂^(?<=no\s)({"|".join(search)})', flags=re.IGNORECASE)我在找什么
______________________
| description |
__________________________
| 0 | Commerce foo |
| 1 | foo commercial |
| 3 | foo commercial boo |
| 5 | foo restaurant |
__________________________发布于 2022-02-15 07:14:30
当前的模式从^(?<=no\s)开始,它断言从字符串开始,应该有一个no,后面跟着一个空格字符,直接放在左边。那是不匹配的。
如果要筛选行,可以使用str.contains而不是findall。
您可以删除锚点^,并将断言更改为(?<!no\s),这将断言不存在no,然后将空格字符直接放在左边,然后向左和右添加单词边界,以防止部分单词匹配。
对于仅匹配的对象,可以将捕获组更改为非捕获的(?:。
如果你打印这个图案,它看起来就像
\b(?<!no\s)(?:restaurant|commerce|commercial)\bdata = {
'description':[
'Commerce foo',
'foo commercial',
'foo no commercial',
'foo commercial boo',
'No commerce',
'foo restaurant',
'boo no restaurant']
}
df = pd.DataFrame(data)
search = ['restaurant', 'commerce', 'commercial']
print(df[df['description'].str.contains(fr'\b(?<!no\s)(?:{"|".join(search)})\b', flags=re.IGNORECASE)])输出
description
0 Commerce foo
1 foo commercial
3 foo commercial boo
5 foo restauranthttps://stackoverflow.com/questions/71121309
复制相似问题