我有下面的代码,希望完成简单的模式识别。我希望它找到所有出现的PDP或CDP或PRS或EDP,然后是(0或最多3个)非数字,然后是(恰好是6个数字)。看起来很简单,但熊猫不断尖叫以下错误。
数据行样本:
row1 CAPS ACCT # /APR 1-APR 30 18/EDP 443996/SPECIAL PRICING
row2 CAPS /EDP# 320902/UNUSED LABELS
ValueError: Wrong number of items passed 5, placement implies 1
df['USPS_refund_no'] = df['APEX Invoice Description'].str.extract(r'((EDP)|(PDP)|(CDP)|(PRS)\D{,3}\d{6})',expand=True)
预先感谢
答案 0 :(得分:1)
在您的情况下,str.extract
需要一个捕获组。要在编号之前匹配替代方案,请将替代列表包含在非捕获组中,并使用外部捕获组捕获整个模式:
df['USPS_refund_no'] = df['APEX Invoice Description'].str.extract(r'((?:EDP|PDP|CDP|PRS)\D{0,3}\d{6})',expand=True)
请参见regex demo。
详细信息
(
-外部捕获组的开始(extract
必需)(?:EDP|PDP|CDP|PRS)
-一个非捕获组,与内部列出的任何替代方案匹配(请注意,您也可以将其写为(?:[EPC]DP|PRS)
):
EDP
-EDP
|
-或PDP
-PDP
|
-或CDP
-CDP
|
-或PRS
-PRS
\D{0,3}
-0到3个非数字\d{6}
-六位数)
-外部捕获组的结尾。