我有以下相似的数据:
df = pd.DataFrame({'pagePath':['/my/retour/details/n8hWu7iWtuRXzSvDvCAUZRAlPda6LM/',
'/my/orders/details/151726/',
'/my/retours/retourmethod/']})
print(df)
pagePath
0 /my/retour/details/n8hWu7iWtuRXzSvDvCAUZRAlPda...
1 /my/orders/details/151726/
2 /my/retours/retourmethod/
我想做的就是将字符串切至(但包括)details
预期产量
pagePath
0 /my/retour/details/
1 /my/orders/details/
2 /my/retours/retourmethod/
以下内容有效,但速度慢
df['pagePath'] = np.where(df.pagePath.str.contains('details'),
df.pagePath.apply(lambda x: x[0:x.find('details')+8]),
df.pagePath)
print(df)
pagePath
0 /my/retour/details/
1 /my/orders/details/
2 /my/retours/retourmethod/
我尝试过正则表达式,但只能使其正常工作(不包括):
df['pagePath'] = np.where(df.pagePath.str.contains('details'),
df.pagePath.str.extract('(.+?(?=details))'),
df.pagePath)
print(df)
pagePath
0 /my/retour/
1 /my/orders/
2 NaN
加上当行不包含NaN
时,正则表达式代码将返回details
因此,我觉得有一种更简单,更优雅的方法。如何编写正则表达式代码来解决我的问题?还是我的解决方案已经足够了?
答案 0 :(得分:2)
您想尝试str.extract
('/'+df.pagePath.str.extract('/(.*)details')+'details')[0].fillna(df.pagePath)
Out[130]:
0 /my/retour/details
1 /my/orders/details
2 /my/retours/retourmethod/
Name: 0, dtype: object
答案 1 :(得分:1)
您需要做的就是在没有'details'
的情况下在正则表达式中提供一个后备选项:
>>> df.pagePath.str.extract('(.+?details/?|.*)')
0
0 /my/retour/details/
1 /my/orders/details/
2 /my/retours/retourmethod/