Python 熊猫:在最大n个分隔符后提取字符串
我的数据如下所示:Python 熊猫:在最大n个分隔符后提取字符串,python,pandas,Python,Pandas,我的数据如下所示: A_1 A_2 B_1 B_2 C_1 C_2 DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01:01 DP0002 02:01:01:02 26:01:01 35:01:01:01 40:01:02 04:82 08:01:01 DP0003 11:
A_1 A_2 B_1 B_2 C_1 C_2
DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01:01
DP0002 02:01:01:02 26:01:01 35:01:01:01 40:01:02 04:82 08:01:01
DP0003 11:01:01 11:01:01:01 15:02:01 56:04 01:02:01 08:01:01
DP0004 11:01:01 34:01:01 15:02:01 15:12 03:03:01:03 08:01:01
我想在最多3个:
之前提取字符串。期望输出:
A_1 A_2 B_1 B_2 C_1 C_2
DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01
DP0002 02:01:01 26:01:01 35:01:01 40:01:02 04:82 08:01:01
DP0003 11:01:01 11:01:01 15:02:01 56:04 01:02:01 08:01:01
DP0004 11:01:01 34:01:01 15:02:01 15:12 03:03:01 08:01:01
我尝试了多种方法,但到目前为止都没有成功:
:
的None
,并抛出一个错误
你能告诉我如何处理这个案子吗?谢谢DataFrame。请更换
正则表达式详细信息:
:在行首断言位置^
:第一个捕获组(\w+:\w+:\w+)
:匹配任意单词字符一次或多次\w+
:按字面意思匹配字符:
:
:第二个捕获组(:.+)
:按字面意思匹配字符:
:
:匹配任意字符一次或多次+
:在零和一次之间匹配上一个标记?
请查看带有所示样本的联机,请尝试以下内容。简单的解释是:使用replace函数并提及regex来匹配2位冒号2位冒号2位冒号2位,并根据OP的示例将所有其他内容保留为不需要
df.astype(str).replace(r'^((?:\d{2}:){2}\d{2})(.*)', r'\1', regex=True)
输出如下:
A_1 A_2 B_1 B_2 C_1 C_2
DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01
DP0002 02:01:01 26:01:01 35:01:01 40:01:02 04:82 08:01:01
DP0003 11:01:01 11:01:01 15:02:01 56:04 01:02:01 08:01:01
DP0004 11:01:01 34:01:01 15:02:01 15:12 03:03:01 08:01:01
regex中的
^([\w]+:){1,3}
可以解决这个问题,我认为它不起作用,它只产生了第一个:
([\w]+:[\w]+:?[\w]+)
前面的数字。这个怎么样?谢谢,它工作得非常好。如果我想稍微扩展一下这个问题,比如从11:01:01G
捕获11:01:01
,我将正则表达式更改为“^(\w+:\w+:\d+)(:.+)?”,它在正则表达式101上显示要正确捕获,但是当我使用df.replace(r'^(\w+:\w+:\d+)(:.+)?”,r'\1',regex=True)
,它仍然返回11:01:01G
。如何解决此问题?@ThanhNguyen请检查^(\w+:\w+:\d+)?
df.replace(r'^(\w+:\w+:\w+)(:.+)?', r'\1', regex=True)
A_1 A_2 B_1 B_2 C_1 C_2
DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01
DP0002 02:01:01 26:01:01 35:01:01 40:01:02 04:82 08:01:01
DP0003 11:01:01 11:01:01 15:02:01 56:04 01:02:01 08:01:01
DP0004 11:01:01 34:01:01 15:02:01 15:12 03:03:01 08:01:01
df.astype(str).replace(r'^((?:\d{2}:){2}\d{2})(.*)', r'\1', regex=True)
A_1 A_2 B_1 B_2 C_1 C_2
DP0001 11:01:01 11:01:01 15:35 51:02:01 07:02:04 15:02:01
DP0002 02:01:01 26:01:01 35:01:01 40:01:02 04:82 08:01:01
DP0003 11:01:01 11:01:01 15:02:01 56:04 01:02:01 08:01:01
DP0004 11:01:01 34:01:01 15:02:01 15:12 03:03:01 08:01:01