Python正则如何添加可选匹配字段 不影响其余必填字段提取
正则可选字段匹配调整方案
问题根源
你之前的正则存在两个核心错误:
- 错误加入
|分支运算符,正则匹配到前半段门店字段后就会终止,不会继续匹配后面的Details等字段 - 使用贪婪匹配
.*会优先吞噬尽可能多的字符,容易把可选的Reason内容吞掉,导致匹配失效
调整后的正则
parser = re.compile( r"your store, ([^,]+).*?(?:Reason: ([^\n]*))?.*?Details: ([^\n]*).*?Created at: ([^\n]*).*?Scheduled end time: ([^\n]*)", flags=re.DOTALL | re.MULTILINE )
正则逻辑说明
- 所有
.*替换为非贪婪匹配.*?,保证按顺序匹配后续字段,不会提前吞噬内容 - 用
(?:Reason: ([^\n]*))?定义可选匹配项:?:将外层括号设为非捕获组,不占用分组索引,末尾的?表示整个分组可以出现0次或1次 - 去掉了错误的分支符,保证所有字段匹配逻辑连续
完整可运行代码
import re import pandas as pd # 正则定义 parser = re.compile( r"your store, ([^,]+).*?(?:Reason: ([^\n]*))?.*?Details: ([^\n]*).*?Created at: ([^\n]*).*?Scheduled end time: ([^\n]*)", flags=re.DOTALL | re.MULTILINE ) # 初始化所有字段列,新增REASON列 df1['STORE'] = '' df1['REASON'] = '' df1['DETAILS'] = '' df1['TIME_PAUSE_CREATED'] = '' df1['TIME_PAUSE_END'] = '' for index, i in enumerate(df1.DESCRIPTION): txt = parser.findall(i) if txt: field = txt[0] df1.loc[index, 'STORE'] = field[0] # 空匹配时填充Null df1.loc[index, 'REASON'] = field[1].strip() if field[1].strip() else 'Null' df1.loc[index, 'DETAILS'] = field[2] df1.loc[index, 'TIME_PAUSE_CREATED'] = field[3] df1.loc[index, 'TIME_PAUSE_END'] = field[4]
额外优化说明
你原有代码中存在变量名笔误:定义的正则变量是parser,但匹配时调用了parser_reg,会导致报错,上述代码已经统一修正。同时使用df.loc赋值,避免触发pandas的SettingWithCopyWarning链式索引警告。
内容的提问来源于stack exchange,提问作者cjwehr
相关产品推荐
相关产品推荐

