Python中COPYSUCCESSFUL正则匹配失效致DataFrame无数据求助
问题解决:COPYSUCCESSFUL列提取全为NaN的原因与修复
问题背景
尝试从给定列表中提取三类数据存入DataFrame:COPYSUCCESSFUL后的URL、one test4:后的数字、soup test0:后的数字。其中后两类提取正常,但COPYSUCCESSFUL列全为NaN,预期应提取两个URL链接。
问题根源
问题出在COPYSUCCESSFUL对应的正则表达式上:
pattern1 = re.compile(r"COPYSUCCESSFUL:\s*(.*?)(?=')")
你在正则中加入了正向预查(?='),这个规则要求匹配到的URL后面必须紧跟着单引号,但你的列表中COPYSUCCESSFUL:后的URL结尾没有单引号,导致正则无法匹配到任何内容,最终该列全为NaN。
修复方案
去掉不必要的单引号预查,直接匹配COPYSUCCESSFUL:之后的所有内容(直到字符串末尾):
pattern1 = re.compile(r"COPYSUCCESSFUL:\s*(.*)")
如果想更严谨,确保匹配到非空内容,可以用:
pattern1 = re.compile(r"COPYSUCCESSFUL:\s*(\S.*)")
完整修复后的代码
import re import pandas as pd import numpy as np test = ['bbb', 'soup test0:88', 'axx', 'xzz', 'one test4: 34','COPYSUCCESSFUL: https://test.test2.nugget.com/f02/01/test1.csv', 'COPYSUCCESSFUL: https://test.test3.nugget.com/f02/01/test3.csv', 'one test4: 66'] # 修正后的正则表达式 pattern1 = re.compile(r"COPYSUCCESSFUL:\s*(.*)") pattern2 = re.compile(r"one test4:\s*(\d+)") pattern3 = re.compile(r"soup test0:\s*(\d+)") copysuccessful = [] one_test4 = [] soup_test0 = [] for item in test: match1 = pattern1.search(item) match2 = pattern2.search(item) match3 = pattern3.search(item) copysuccessful.append(match1.group(1) if match1 else np.nan) one_test4.append(match2.group(1) if match2 else np.nan) soup_test0.append(match3.group(1) if match3 else np.nan) data = {'COPYSUCCESSFUL': copysuccessful, 'one test4': one_test4, 'soup test0': soup_test0} df = pd.DataFrame(data) print(df)
运行后,COPYSUCCESSFUL列会正确提取出两个URL链接,其他列保持正常提取结果。
内容的提问来源于stack exchange,提问作者Thanatos
相关产品推荐
相关产品推荐

