熊猫和正则表达式

时间:2018-09-19 19:56:22

标签: regex pandas

我有下面的代码,希望完成简单的模式识别。我希望它找到所有出现的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)

预先感谢

1 个答案:

答案 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}-六位数
  • )-外部捕获组的结尾。