匹配直到第一次出现

时间:2017-09-24 03:55:40

标签: python regex pandas

我的pandas数据框列center如下所示:

In [6]: df.center.head()
Out[6]:
0    /Users/sachin/uniwork/IMG/center_2017_09_17_20...
1    /Users/sachin/uniwork/IMG/center_2017_09_17_20...
2    /Users/sachin/uniwork/IMG/center_2017_09_17_20...
3    /Users/sachin/uniwork/IMG/center_2017_09_17_20...
4    /Users/sachin/uniwork/IMG/center_2017_09_17_20...
Name: center, dtype: object

我希望摆脱IMG之前的所有垃圾。但是,当我执行以下字符串替换时,它会在IMG文件夹之前和之后替换IMG周围的所有

In [7]: df.head().center.str.replace(r'[^IMG]+?','')
Out[7]:
0    IMG
1    IMG
2    IMG
3    IMG
4    IMG
Name: center, dtype: object

我认为放?会阻止它在第一次出现IMG之后进行搜索,但这肯定不是上面所见的情况。

执行上述正则表达式的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

另一种借助拆分的方法虽然我更喜欢正则表达式,即

df.center.apply(lambda x : '/IMG'+x.split('IMG')[-1])

输出:

0    /IMG/center_2017_09_17_20...
1    /IMG/center_2017_09_17_20...
2    /IMG/center_2017_09_17_20...
3    /IMG/center_2017_09_17_20...
4    /IMG/center_2017_09_17_20...
Name: center, dtype: object

或者感谢@Zero

'/IMG' + df.center.str.rsplit('/IMG', 1).str[1]

答案 1 :(得分:2)

使用'.*(?=IMG/)' - 匹配字符串中最后一个IMG/之前的所有内容。

In [3165]: df.center.str.replace('.*(?=IMG/)', '')
Out[3165]:
0    IMG/center_2017_09_17_20...
1    IMG/center_2017_09_17_20...
2    IMG/center_2017_09_17_20...
3    IMG/center_2017_09_17_20...
4    IMG/center_2017_09_17_20...
Name: center, dtype: object

.* - 匹配一切 (?=IMG/) - 在您遇到模式IMG/之前,捕获忽略模式的群组,IMG。稍后更换捕获的组。