Python正则提取问题:从字符串列表提取三部分生成DataFrame
修正正则表达式以正确提取三部分内容
你的核心问题是原正则里的[^(abc)]用错了——这个语法是字符集取反,匹配的是任意不是(、a、b、c的单个字符,完全不符合“中间部分不以abc结尾”的需求,导致结尾为a/b/c的中间部分被错误截断。
修正后的正则表达式
使用负向后顾断言来确保中间部分不以abc结尾,同时保留前缀和后缀的可选匹配:
r"^(s_|t_q_)?(\w+)(?<!abc)(abc)?$"
正则逻辑解释
^:匹配字符串开头,确保从开头开始匹配(s_|t_q_)?:可选匹配前缀s_或t_q_,匹配不到则返回NaN(\w+):贪婪匹配中间部分(字母、数字、下划线)(?<!abc):负向后顾断言,确保中间部分的结尾不是abc,满足“中间部分不能以abc结尾”的要求(abc)?$:可选匹配结尾的abc,匹配不到则返回NaN,$确保匹配到字符串结尾
完整代码及运行结果
import pandas as pd import re str_list = ['s_c45abc','s_ab00_a','t_q_de45abc','t_q_123','t_q_c34b7_da','456a','456abc','456b'] result = pd.Series(str_list).str.extract(r"^(s_|t_q_)?(\w+)(?<!abc)(abc)?$") print(result)
运行后得到的结果完全符合你的期望:
0 1 2 0 s_ c45 abc 1 s_ ab00_a NaN 2 t_q_ de45 abc 3 t_q_ 123 NaN 4 t_q_ c34b7_da NaN 5 NaN 456a NaN 6 NaN 456 abc 7 NaN 456b NaN
内容的提问来源于stack exchange,提问作者nnnnnn0000
相关产品推荐
相关产品推荐

