
    <|j,                        d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 g dZg dZg d	Zg d
Z ej                  d      ZddZddZddZddZddZddZddZy)u   纪念钞解析器 (board 151)

解析纪念钞收购帖文本，提取品种名、价格分类（标十/标百/刀/散张/捆）、数量。
参考 coin_parser 的多模式匹配思路，适配纪念钞价格表达。
    )annotationsN   )PriceRecord)_looks_like_price_is_noise_name_is_bank_account_row_clean_name)u   生肖豹王u   生肖钞王u   迎接新世纪钞u   世纪龙钞u	   小龙钞u	   大龙钞u   龙钞u	   有钱人u	   财神刀u	   财神龙u   龙尊u   马钞u   蛇钞u	   奥运钞u	   建国钞u	   航天钞u   马三u	   小司令)	   标十   标10   标百   刀   散张u   裸张u   散钞   捆u   件)u   无347u   无47u   无34u   无4u   带4u   无3)u   ^楼主$u   ^评分$u   ^查看$u   ^亮照亮证$z^QQ$u   ^确认$u   ^营销员第u   ^认证员注u   ^姓名[：:]u   ^地址[：:]u   ^电话[：:]u   ^手机[：:]u   ^微信[：:]u	   ^QQ[：:]u   ^建行[：:]u   ^工行[：:]u   ^中行[：:]u   ^农行[：:]u   ^交行[：:]u   ^邮政[：:]u   ^民生[：:]u   ^华夏[：:]u   ^管理员注u   ^认证推荐人u   ^电子邮件u   ^备注[：:]u   ^此主题相关图片u   ^一尘互评u   ^收货地址u
   ^开户行uw   [█★▄▅▆▇███▓▒░◇◆◇◆●○◎※☆♬♪♭♯♮♯▼▽◤◥◄◢━┃┏┓┗┛]c                   | j                  dd      j                  dd      j                  dd      j                  dd      }|j                  d	d
      j                  dd      j                  dd      j                  dd      }t        j                  dd|      }t        j                  d|      }t        j                  dd|      }|j	                         S )uB   预处理：全角转半角、去装饰符号、去多余空格。u   ，,u   。.u   ；;u   ：:u   【[u   】]u   （(u   ）)z(\d+)\.{2,}(\d+)z\1.\2 z
[ \t\xa0]+)replaceresubDECORATION_PATTERNstrip)textts     0/opt/daily-market/src/parsers/banknote_parser.py
preprocessr"   6   s     	UC ((4<<UCHPPQVX[\A			%%%eS199%EMMeUXYA
"Ha0AsA&A
}c1%A779    c                p    | j                         } | syt        D ]  }t        j                  ||       s y y)u0   判断是否为论坛模板行（应跳过）。TF)r   TEMPLATE_LINE_PATTERNSr   match)linepats     r!   _is_template_liner)   D   s8    ::<D% 88C r#   c                   | j                         }t        j                  d|      }|r||j                         d }t        j                  d|      }|r!||j                         d j                         }t        j                  d|      }|rZ||j                         d j                         }t        j                  d|      }|r!||j                         d j                         }t        j                  dd|      }t        j                  dd|      }d}t
        D ]
  }||v s|} n d}t        D ]
  }||v s|} n |s+t        j                  d	|      }|r|j                  d
      }ny|}|rW||v rS|j                  |      }	||	t        |      z   |	t        |      z   dz    }
||
v s||d|	t        |      z   dz    v r|dz   |z   }t        |      S )uD  从文本中提取纪念钞品种名。

    策略：
    1. 剥离动词前缀（收/求/收购/求购/出/出售/高价收购等）
    2. 剥离价格前置（5350收有钱人 → 有钱人）
    3. 匹配已知品种关键词
    4. 附加号码修饰（带4/无4/无47/无347）和包装分类（标十/刀等）
    u3   ^(收购|求购|出售|收|求|出|售)\s*[:：]\s*NuI   ^(\d+\.?\d*)\s*(元|/)?\s*(高价)?(收购|求购|出售|收|求|出|售)ur   ^(高价|先款|现款|高价先款|高价现款)\s*(\d+\.?\d*)?\s*(元)?\s*(收购|求购|出售|收|求|出|售)u   ^(\d+\.?\d*)\s*(元)?\s*u   ^\[原创\]\s* z^\[.*?\]\s*u   ^([\u4e00-\u9fff]{2,8}钞)r      
   r   )r   r   r&   endr   NUMBER_PREFIXESBANKNOTE_NAMESgroupfindlenr	   )r   r    mm2
number_modprefix
found_namebnresultidxafters              r!   _extract_namer=   O   s    	

A 	GKAaeeghK 	]_`aAaeeghK 	  G  IJ  	KAaeeghKXX115"&&()""$A 	 "a(A
~r1%A J! Q;J J 7J
 HH2A6J FjAoffZ #J'c*o(=(AB*2M3Z3H23M0N"N#%
2Fvr#   c                h   dddddd}| j                         }dD ]K  }t        j                  ||      }|st        |j	                  d            s7|j	                  d      |d<    n t        j                  d|      }|r.t        |j	                  d            r|j	                  d      |d<   dD ]i  }t        j                  ||      }|st        |j	                  d            s7t        |j	                  d            d	k\  sU|j	                  d      |d
<    n dD ]K  }t        j                  ||      }|st        |j	                  d            s7|j	                  d      |d<    n |d   sFt        j                  d|      }|r.t        |j	                  d            r|j	                  d      |d<   t        j                  d|      }|r.t        |j	                  d            r|j	                  d      |d<   t        d |j                         D              }|st        j                  d|      }|rzt        |j	                  d            r`|j	                  d      }t        |      }d|v sd|v r|dk\  r||d<   |S d|v r|d	k\  r||d<   |S d
|v r|d	k\  r||d
<   |S d|v r||d<   |S ||d<   |S )uc   提取价格分类。返回 dict: {"标十": "", "标百": "", "刀": "", "散张": "", "捆": ""}.r+   r
   r   r   r   r   )u   标十\s*[:：]?\s*(\d+\.?\d*)u   标10\s*[:：]?\s*(\d+\.?\d*)r   r
   u   标百\s*[:：]?\s*(\d+\.?\d*)r   )u?   (?:带4|无4|无47|无347|无34)?\s*刀\s*[:：]?\s*(\d+\.?\d*)u@   (\d+\.?\d*)\s*(?:元)?\s*(?:带4|无4|无47|无347|无34)?\s*刀d   r   )u   散张\s*[:：]?\s*(\d+\.?\d*)u   裸张\s*[:：]?\s*(\d+\.?\d*)u   散钞\s*[:：]?\s*(\d+\.?\d*)u   散\s+(\d+\.?\d*)u   单价\s*[:：]?\s*(\d+\.?\d*)u7   单张\s*[:：]?\s*(?:价格)?\s*[\(（]?\s*(\d+\.?\d*)r   u`   价格\s*[\(（]\s*(\d+\.?\d*)\s*(?:元)?\s*[一\-~～至到]\s*(\d+\.?\d*)\s*(?:元)?\s*[\)）]u   捆\s*[:：]?\s*(\d+\.?\d*)r   c              3      K   | ]  }|  y wN .0vs     r!   	<genexpr>z"_extract_prices.<locals>.<genexpr>   s     1Aa1s   uo   ^(\d+\.?\d*)\s*(?:元)?\s*/?\s*(?:组|张|刀)?\s*(?:高价|先款|现款)?\s*(?:收购|求购|收|求|出|售)r   2   )	r   r   searchr   r1   floatanyvaluesr&   )	r   namer:   r    r(   r4   has_package	price_valfvs	            r!   _extract_pricesrQ      s   br"MF

A U IIc1"1771:. wwqzF8	 			3Q7Aqwwqz*771:xU IIc1"1771:.QWWQZ C' !
uL  IIc1"1771:. wwqzF8 (IIy{|}"1771:. wwqzF8 			0!4Aqwwqz*
u 111KHH  H  JK  L"1771:.
Iy!BAA28#,x  M Q29#,x  M !c	 )u M ! )u M $-x Mr#   c                   | j                         }t        j                  d|      }|r"|j                  d      |j                  d      fS ddddddd	d
dddd}t        j                  d|      }|rA|j	                  |j                  d      |j                  d            |j                  d      fS t        j                  d|      }|r"|j                  d      |j                  d      fS t        j                  d|      }|r"|j                  d      |j                  d      fS t        j                  d|      }|r"|j                  d      |j                  d      fS y)uA   提取需求数量和单位。返回 (quantity, quantity_unit)。u#   要\s*(\d+)\s*(组|张|刀|件|捆)r      12345678910)u   一u   二u   两u   三u   四u   五u   六u   七u   八u   九u   十uC   要\s*([一二两三四五六七八九十])\s*(组|张|刀|件|捆)u   (\d+)\s*(张|刀|件|捆|组)u)   一共要\s*(\d+)\s*(组|张|刀|件|捆)u&   暂要\s*(\d+)\s*(组|张|刀|件|捆))r+   r+   )r   r   rI   r1   get)r   r    r4   cn_maps       r!   _extract_quantityr`      s:   

A 			8!<Awwqz1771:%% SSSSQUWF
		XZ[\Azz!''!*aggaj11771:== 			2A6Awwqz1771:%% 			>BAwwqz1771:%% 			;Q?Awwqz1771:%%r#   c                    | rt        |       ryt        | |      ryt        d |j                         D              }t	        |j                               }|xs |S )u   校验记录是否有效。Fc              3  2   K   | ]  }t        |        y wrB   )r   rD   s     r!   rG   z#_is_valid_record.<locals>.<genexpr>  s     BQ%a(Bs   )r   r   rK   rL   boolr   )rM   pricesquantityraw_text	has_pricehas_qtys         r!   _is_valid_recordri      sN    >$'D(+B&--/BBI8>>#$Gr#   c                V   t        |       }g }|j                  d      D ]  }|j                         }|rt        |      r"d|v r't	        |      }|s5t        ||      }t        |      \  }}t        ||||      s^|j                         D cg c]  }t        |      st        |       }	}|	rt        t        |	            nd}
|}dD ]!  }|j                  |      s||vr|dz   |z   } n |j                  t        |j                         |
|d||ddd|
              |S c c}w )u   纪念钞解析入口。
u   出售r+   r?   r   )
rM   	ref_priceprice_detailsunitre   quantity_unitpackage_reqquality_reqother_notesrf   )r"   splitr   r)   r=   rQ   r`   ri   rL   r   rJ   strminr^   appendr   )r   cleanedrecordsr'   rM   rd   re   ro   rF   valid_pricesrl   	full_namepkgs                r!   parser|     sN   G!#Gd# .zz|(.t T" !t, #4D"9-  fh= +1--/RQ=Nq=QaRR.:CL)*	 	? 	Czz#i' $s
S 0I		 	{" '
 	G.` N1 Ss   D& D&)r   rt   returnrt   )r'   rt   r}   rc   )r   rt   rM   rt   r}   dict)r   rt   r}   ztuple[str, str])
rM   rt   rd   r~   re   rt   rf   rt   r}   rc   )r   rt   r}   zlist[PriceRecord])__doc__
__future__r   r   baser   coin_parserr   r   r   r	   r0   PACKAGE_KEYWORDSr/   r%   compiler   r"   r)   r=   rQ   r`   ri   r|   rC   r#   r!   <module>r      s    # 	   d  G   RZZ  ![  \ BJBJD 5r#   