Explorar el Código

抽取-优化-备份过大过小

zhengkun hace 3 años
padre
commit
178b700038

+ 29 - 2
src/jy/clear/tonumber.go

@@ -23,7 +23,7 @@ var regQianw *regexp.Regexp     //部分千万单位
 
 var regPercentMoney *regexp.Regexp  //取出 xx%
 
-var moneyChar = map[string]interface{}{ //"〇": "0", "零": "0",
+var moneyChar = map[string]interface{}{ //"〇": "0", "零": "0",壹贰叁肆伍陆柒捌玖
 	"一": float64(1), "壹": float64(1), "二": float64(2), "贰": float64(2), "三": float64(3), "叁": float64(3), "四": float64(4), "肆": float64(4), "五": float64(5), "伍": float64(5),
 	"六": float64(6), "陆": float64(6), "七": float64(7), "柒": float64(7), "八": float64(8), "捌": float64(8), "九": float64(9), "玖": float64(9), "十": float64(10), "拾": float64(10),
 	"百": float64(100), "佰": float64(100), "千": float64(1000), "仟": float64(1000), "万": float64(10000), "亿": float64(100000000), "億": float64(100000000),
@@ -40,6 +40,10 @@ var kxjsReg *regexp.Regexp
 
 var unpkvBidamountReg =  regexp.MustCompile("^([Xx]\\+[1-9\\.]+元/每)")
 var regUnitMoneyClean =  regexp.MustCompile("^(.*单价[0-9.]+元[/][袋|块])[,,](含税总价[0-9.]+[万元]+)[.。]$")
+var blackMoneyClean =  regexp.MustCompile("^([0-9.]+以下[万]?|分)$")
+var impactMoneyClean =  regexp.MustCompile("(分二串口|分站模块)")
+//大写金额补充
+var impactMoneyeplenish =  regexp.MustCompile("^([壹贰叁肆伍陆柒捌玖]分)")
 
 func init() {
 	regOperator, _ = regexp.Compile(`[*|+|)*)]`)
@@ -135,16 +139,36 @@ func ObjToMoney(data []interface{}, spidercode ...string) []interface{} {
 	}else {
 		totmpstr = util.ObjToString(tmpstr)
 	}
+
+	//异常替换
 	if unpkvBidamountReg.MatchString(totmpstr) {
 		totmpstr = unpkvBidamountReg.ReplaceAllString(totmpstr,"")
 		(data)[0] = totmpstr
 	}
-
+	//单位指定
 	if regUnitMoneyClean.MatchString(totmpstr) {
 		totmpstr = regUnitMoneyClean.ReplaceAllString(totmpstr,"$2")
 		(data)[0] = totmpstr
 	}
 
+	//特殊替换
+	if impactMoneyClean.MatchString(totmpstr) {
+		totmpstr = impactMoneyClean.ReplaceAllString(totmpstr,"")
+		(data)[0] = totmpstr
+	}
+
+	//大写金额补充
+	if impactMoneyeplenish.MatchString(totmpstr) {
+		totmpstr = "零元" + totmpstr
+		(data)[0] = totmpstr
+	}
+
+	//黑名单
+	if blackMoneyClean.MatchString(totmpstr) {
+		totmpstr = ""
+		(data)[0] = totmpstr
+	}
+
 	//未含税总价1454400.00元,税率6%,含税总价1541664.00元
 	Percent:= regPercentMoney.FindAllString(totmpstr,-1)
 	for _,v:=range Percent{
@@ -172,6 +196,9 @@ func ObjToMoney(data []interface{}, spidercode ...string) []interface{} {
 			return data
 		}
 	}
+
+
+
 	ret := capitalMoney(data)[0]
 	if ret.(float64) < float64(10000) || ret.(float64) > float64(50000000000) {
 		ret2, _ := numMoney(data)

+ 26 - 45
src/jy/extract/extract.go

@@ -27,7 +27,6 @@ import (
 var (
 	lock, lockrule, lockclear, locktag, blocktag sync.RWMutex
     JYUrl = "https://www.jianyu360.com/article/content/%s.html"
-
 	cut           = ju.NewCut()                          //获取正文并清理
 	ExtLogs       map[*TaskInfo][]map[string]interface{} //抽取日志
 	TaskList      map[string]*ExtractTask                //任务列表
@@ -37,49 +36,6 @@ var (
 	Fields        = `{"title":1,"summary":1,"detail":1,"contenthtml":1,"site":1,"spidercode":1,"toptype":1,"subtype":1,"bidstatus":1,"area":1,"city":1,"comeintime":1,"publishtime":1,"sensitive":1,"projectinfo":1,"jsondata":1,"href":1,"infoformat":1,"attach_text":1,"dataging":1,"review_experts":1,"purchasing":1}`
 	//Fields        = `{"title":1,"summary":1,"detail":1,"contenthtml":1,"site":1,"spidercode":1,"toptype":1,"subtype":1,"bidstatus":1,"area":1,"city":1,"comeintime":1,"publishtime":1,"sensitive":1,"projectinfo":1,"jsondata":1,"href":1,"infoformat":1,"attach_text":1,"dataging":1,"new_attach_text":1,"createtime":1,"currency":1,"id":1,"company_email":1,"buyerclass":1,"tagname":1,"company_phone":1,"appid":1,"industry":1,"projectscope":1,"item":1,"s_subscopeclass":1,"matchkey":1,"jybxhref":1,"legal_person":1,"matchtype":1,"review_experts":1,"purchasing":1}`
 	Fields2 = `{"budget":1,"bidamount":1,"title":1,"projectname":1,"winner":1}`
-	/*f       = map[string]bool{
-		"T":                true,
-		"_d":               true,
-		"area":             true,
-		"channel":          true,
-		"comeintime":       true,
-		"competehref":      true,
-		"href":             true,
-		"l_np_publishtime": true,
-		"publishtime":      true,
-		"sendflag":         true,
-		"site":             true,
-		"spidercode":       true,
-		"title":            true,
-		"projectname":      true,
-	}*/
-	/*f       = map[string]bool{
-		"contentid":        true,
-		"progName":               true,
-		"updateTime":             true,
-		"url":          true,
-		"areaId":       true,
-		"areaName":      true,
-		"popTitle":             true,
-		"showTitle": true,
-		"progId":      true,
-		"catid":         true,
-		"isConcern":             true,
-		"followCount":       true,
-		"followSuggestion":            true,
-		"isBoutique":            true,
-		"canTj":            true,
-		"tenderAmountNumber":            true,
-		"tenderAmountUnit":            true,
-		"bidderAmountNumber":            true,
-		"bidderAmountUnit":            true,
-		"registrationBeginTime":            true,
-		"registrationEndTime":            true,
-		"starNum":            true,
-		"title":            true,
-		"proInvested":            true,
-		"projectname":      true,
-	}*/
 	spidercode = map[string]bool{
 		"gd_zhsggzyjyzx_jsgc_fjczbgg":     true,
 		"js_szgyyqggzyjyzx_jsgc_zjfbgs":   true,
@@ -109,6 +65,9 @@ var (
 	}
 )
 
+//var packageUnUsedReg = regexp.MustCompile("1[0-9].投标报价\n1[0-9].1")
+
+
 //启动测试抽取-、、、、结果追踪
 func StartExtractTestTask(taskId, startId, num, resultcoll, trackcoll string) bool {
 	defer qu.Catch()
@@ -557,6 +516,28 @@ func file2text(doc *map[string]interface{}) {
 	(*doc)["detailfile"] = strings.ReplaceAll(tmpstr, "附件", "")
 }
 
+//判断-附件分包是否有效
+func isUsedPackageJF(jf_package map[string]map[string]interface{})bool {
+	if jf_package == nil ||  len(jf_package) == 0 {
+		return false
+	}
+	for _,pack := range jf_package {
+		budget := qu.Float64All(pack["budget"])
+		bidamount := qu.Float64All(pack["bidamount"])
+		//winner := qu.Float64All(pack["winner"])
+		//text := qu.ObjToString(pack["text"])
+		//13.投标报价\n13.1本次报价
+		//14.投标报价\n14.1投标报价
+		if budget >0.0  && budget <= 1.0 {
+			return false
+		}
+		if bidamount >0.0  && bidamount <= 1.0 {
+			return false
+		}
+	}
+	return true
+}
+
 //抽取-正文
 func (e *ExtractTask) ExtractProcess(j, jf *ju.Job, isSite bool) {
 	e.ExtractDetail(j, isSite, j.SpiderCode) //正文抽取属性
@@ -595,7 +576,7 @@ func (e *ExtractTask) ExtractProcess(j, jf *ju.Job, isSite bool) {
 		if len(j.Winnerorder) == 0 && jf.Winnerorder != nil && len(jf.Winnerorder) > 0 {
 			j.Winnerorder = append(j.Winnerorder, jf.Winnerorder...)
 		}
-		if len(j.PackageInfo) == 0 && jf.PackageInfo != nil && len(jf.PackageInfo) > 0 {
+		if len(j.PackageInfo) == 0 &&  isUsedPackageJF(jf.PackageInfo) {
 			j.PackageInfo =  jf.PackageInfo
 		}
 	}

+ 0 - 1
src/jy/pretreated/analystep.go

@@ -32,7 +32,6 @@ var formattext5 = regexp.MustCompile("投标报价[::]包件1[::][0-9.万元
 var formattext6  = regexp.MustCompile("(投标报价[::][0-9.]+)\n([万元]+)")
 
 
-
 //特别处理-表格数据
 var tablePackageWinnerReg = regexp.MustCompile("[\n]?(成交侯选人|第一中标候选人)[::](.{4,15}(公司|厂))")
 

+ 47 - 23
src/jy/pretreated/analytable.go

@@ -133,6 +133,7 @@ var (
 
 	//新增-分包-表格-sortKV
 	budgetSortKVReg = regexp.MustCompile("(预算)")
+	bidamountSortKVReg = regexp.MustCompile("(成交结果[((]万元[))])")
 	winnerSortKVReg = regexp.MustCompile("(投标人[((]供应商[))]名称)")
 )
 
@@ -239,6 +240,7 @@ func CommonDataAnaly(k, tabletag, tabledesc string, v interface{}, isSite bool,
 var glRex *regexp.Regexp = regexp.MustCompile("(成交|中标|候选|排名|名次|供应商排序|中标候选人|名单及其排序|排序)")
 var djReg *regexp.Regexp = regexp.MustCompile("^单价")
 var hxrRex *regexp.Regexp = regexp.MustCompile("((成交|中标|中选)?候选人[弟|第][1-5一二三四五]名|[弟|第][1-5一二三四五][名]?(成交|中标|中选)?候选人)")
+var winnerRex *regexp.Regexp = regexp.MustCompile("(公司)$")
 
 //判断数组string 是否重复
 func isRepeatArrString(arr1,arr2 []string)bool{
@@ -306,24 +308,24 @@ func (table *Table) KVFilter(isSite bool, codeSite string) {
 	//处理值是数组的kv   放入标准化kv中 standKV //处理table.SortKV.value为数组的情况
 	table.sortKVArr(as, isSite, codeSite)
 
-	//if len(table.WinnerOrder) == 0 { //在计算一下是否拼接
-	//	winsArr := []string{}
-	//	sortsArr := []string{}
-	//	for _, k := range table.SortKV.Keys {
-	//		if hxrRex.MatchString(k) {
-	//			v := table.SortKV.Map[k]
-	//			if new_v, ok := v.(string); ok {
-	//				winsArr = append(winsArr,new_v)
-	//				sortsArr = append(sortsArr,k)
-	//			}
-	//		}
-	//	}
-	//	if len(winsArr)>1 {
-	//		as.AddKey("中标候选人名称", winsArr)
-	//		as.AddKey("中标候选人排序", sortsArr)
-	//		table.sortKVArr(as, isSite, codeSite)
-	//	}
-	//}
+	if len(table.WinnerOrder) == 0 { //在计算一下是否拼接
+		winsArr := []string{}
+		sortsArr := []string{}
+		for _, k := range table.SortKV.Keys {
+			if hxrRex.MatchString(k) {
+				v := table.SortKV.Map[k]
+				if new_v, ok := v.(string); ok && winnerRex.MatchString(new_v) {
+					winsArr = append(winsArr,new_v)
+					sortsArr = append(sortsArr,k)
+				}
+			}
+		}
+		if len(winsArr)>1 {
+			as.AddKey("中标候选人名称", winsArr)
+			as.AddKey("中标候选人排序", sortsArr)
+			table.sortKVArr(as, isSite, codeSite)
+		}
+	}
 
 	if len(table.WinnerOrder) > 0 || !table.BPackage {
 		winnerOrder := []map[string]interface{}{}
@@ -386,7 +388,7 @@ func (table *Table) KVFilter(isSite bool, codeSite string) {
 }
 
 var winMoneyReg *regexp.Regexp = regexp.MustCompile("(报价|投标价|投标总价)")
-var winNoMoneyReg *regexp.Regexp = regexp.MustCompile("(得分)")
+var winNoMoneyReg *regexp.Regexp = regexp.MustCompile("(得分|时间|序号)")
 //处理table.SortKV.value为数组的情况
 func (table *Table) sortKVArr(as *SortMap, isSite bool, codeSite string) {
 	winnertag := iswinnertabletag.MatchString(table.Tag) && !nswinnertabletag.MatchString(table.Tag) //table标签
@@ -1575,7 +1577,7 @@ func (table *Table) FindKV(isSite bool, codeSite string) {
 		//若第一排全为头-临时让第二排-新增 左临 查询,zhengkun
 		tb_first_allhead := false
 		for tr_index, tr := range table.TRs {
-			if tr_index==7 {
+			if tr_index==0 {
 				//fmt.Println("调试")
 			}
 			bcon = trSingleColumn(tr, bcon, table) //tr单列,是否丢弃内容
@@ -1603,6 +1605,7 @@ func (table *Table) FindKV(isSite bool, codeSite string) {
 					direct, vdirect = 2, 1
 				}
 			}
+
 			for _, td := range tr.TDs {
 				if !td.BH && td.KVDirect < 3 {
 					if !table.FindTdVal(td, direct, vdirect) { //table.FindTdVal()存储了table.SortKV
@@ -2295,10 +2298,8 @@ func (tn *Table) CheckMultiPackageByTable(isSite bool, codeSite string) (b bool,
 							if !excludeKey.MatchString(kc) {
 								bp.Text += fmt.Sprintf("%v:%v\n", kc, cv[0].Value)
 							}
-
 						}
-
-					}else { //新增 - 特殊情况 - 查找sortKV - 预算 - 中标单位
+					}else { //新增 - 特殊情况 - 查找sortKV - 预算 - 中标金额 - 中标单位
 						for k,v := range tn.SortKV.Map {
 							if budgetSortKVReg.MatchString(k) {
 								if vs, ok := v.([]string); ok {
@@ -2316,6 +2317,29 @@ func (tn *Table) CheckMultiPackageByTable(isSite bool, codeSite string) (b bool,
 									}
 								}
 							}
+							if bidamountSortKVReg.MatchString(k) {
+								if vs, ok := v.([]string); ok {
+									if len(index)==len(vs)  {
+										moneys := clear.ObjToMoney([]interface{}{vs[nk], ""})
+										if len(moneys) > 0 {
+											if vf, ok := moneys[0].(float64); ok {
+												if !strings.Contains(vs[nk],"万") {
+													vf = 10000.0*vf
+												}
+												bp.Bidamount = vf
+												bp.IsTrueBidamount = moneys[len(moneys)-1].(bool)
+											} else if vi, ok := moneys[0].(int); ok {
+												if !strings.Contains(vs[nk],"万") {
+													vi = 10000*vi
+												}
+												bp.Bidamount = float64(vi)
+												bp.IsTrueBidamount = moneys[len(moneys)-1].(bool)
+											}
+										}
+									}
+								}
+							}
+
 							if winnerSortKVReg.MatchString(k) {
 								if vs, ok := v.([]string); ok {
 									if len(index) == len(vs) {

+ 1 - 1
src/jy/pretreated/division.go

@@ -124,7 +124,7 @@ var (
 
 
 	untitleReg  = regexp.MustCompile("(技术评分明细表)")
-    unpriceReg =  regexp.MustCompile("^([Xx]\\+[1-9\\.]+元/每)")
+    unpriceReg =  regexp.MustCompile("(^([Xx]\\+[1-9\\.]+元/每)|分析)")
 
 	//敏感词-影响分包-替换-分割
 	replaceSenstiveReg1 = regexp.MustCompile("([一二三四五六七八九十1-9][、]项目名称[::].*采购项目)([一二三四五六七八九十1-9][、]采购结果)")

+ 18 - 18
src/jy/pretreated/kv_test.go

@@ -5,22 +5,22 @@ import (
 )
 
 func Test_kv(t *testing.T) {
-	con := `工程编码:130301S16365-01-19 
-工程类别:公共房屋建筑 
-
-工程名称:秦皇岛市食品药品检验中心建设项目勘察 建设单位:秦皇岛市食品和市场监督管理局 投资性质:政府 所在地区:海港区 招标方式:公开招标 
-招标代理单位:秦皇岛泓远工程项目管理有限公司 
-中标单位:中冶沈勘秦皇岛设计研究院有限公司 
-中标顺序:
-第1顺序中标人	中冶沈勘秦皇岛设计研究院有限公司
-第2顺序中标人	秦皇岛市建筑设计院
-第3顺序中标人	河北宝地建设工程有限公司
-中标范围,内容:按要求完成本工程勘察所包含的全部内容 中标时间:2016-10-11 13:22(即北京时间:14:20)  公示时间:2016-10-12 
-中标价(元)/费率(%)(人民币:元):0 中标工期(天):20 
-项目经理姓名:王平 项目经理编码:AY131300747 质量承诺:合格 建筑面积(平米):498
-参加投标企业:秦皇岛市建筑设计院
-中冶沈勘秦皇岛设计研究院有限公司
-河北宝地建设工程有限公司
- 备注:勘察浮动幅度值K为:0.20`
-	FindKv(con, "")
+//	con := `工程编码:130301S16365-01-19
+//工程类别:公共房屋建筑
+//
+//工程名称:秦皇岛市食品药品检验中心建设项目勘察 建设单位:秦皇岛市食品和市场监督管理局 投资性质:政府 所在地区:海港区 招标方式:公开招标
+//招标代理单位:秦皇岛泓远工程项目管理有限公司
+//中标单位:中冶沈勘秦皇岛设计研究院有限公司
+//中标顺序:
+//第1顺序中标人	中冶沈勘秦皇岛设计研究院有限公司
+//第2顺序中标人	秦皇岛市建筑设计院
+//第3顺序中标人	河北宝地建设工程有限公司
+//中标范围,内容:按要求完成本工程勘察所包含的全部内容 中标时间:2016-10-11 13:22(即北京时间:14:20)  公示时间:2016-10-12
+//中标价(元)/费率(%)(人民币:元):0 中标工期(天):20
+//项目经理姓名:王平 项目经理编码:AY131300747 质量承诺:合格 建筑面积(平米):498
+//参加投标企业:秦皇岛市建筑设计院
+//中冶沈勘秦皇岛设计研究院有限公司
+//河北宝地建设工程有限公司
+// 备注:勘察浮动幅度值K为:0.20`
+//	FindKv(con, "")
 }

+ 27 - 9
src/jy/pretreated/winnerorder.go

@@ -44,14 +44,14 @@ var (
     winnerReg9  = regexp.MustCompile("(第[一二三四五六七八九十]中[选|标]?候选人|中标人[1-9])[::\\s]+投标人名称([\\s]+)?([\u4E00-\u9FA5]{4,25})[\\s]+(投标报价)([\\s]+)?([0-9\\.\\s万元]+)")
     winnerReg10 = regexp.MustCompile("(第[一二三四五六七八九十]中标人)[::\\s]+?报价[¥]?([0-9\\.\\s万元]+)[;;]([\u4E00-\u9FA5]{4,20})")
 	winnerReg11 = regexp.MustCompile("([弟|第][一二三四五六七八九十]中[标|选]候选人)[::\\s]+?(单位名称|投标人名称)[::]?(.*)[\\s]+?(参选报价|投标报价[((]含税[))]|投标报价[((]元[))])[::]?(.*)")
-    winnerReg12 = regexp.MustCompile("(中[标|选]候选人[弟|第][一二三四五六七八九十0-9]名|[弟|第][一二三四五六七八九十0-9](中标)?候选人)[::\\s ]+?(.*)[ \\s,,]+?(投标报价|投标总报价|金额)[::]?([0-9\\.\\s万元]+)")
+    winnerReg12 = regexp.MustCompile("(中[标|选]候选人[弟|第][一二三四五六七八九十0-9]名|[弟|第][一二三四五六七八九十0-9](中标)?候选人)([::\\s ]+)?(.*)[ \\s,,]+?(投标报价|投标总报价|金额)[::]?([0-9\\.\\s万元]+)")
 	winnerReg13 = regexp.MustCompile("([弟|第][一二三四五六七八九十0-9])\n(成交候选人|成交供应商)\n(.*)\n([0-9\\.\\s万元]+)")
 	winnerReg14 = regexp.MustCompile("(中标候选人|成交候选人)\n.*\n.*\n第[1-9][\\s]+?名")
  	winnerReg14_1  = regexp.MustCompile("(第[1-9])[\\s]+?名[::](.{4,20}公司)[\\s]+中标价[::]([0-9\\.\\s万元]+)")
     winnerReg15 = regexp.MustCompile("([弟|第][一二三四五六七八九十0-9](中标|中选)?候选人)[::](.*)[ \\s\\n,,]+(最终报价[::\\s]+不含税单价.*)?不含税总价[::]?([0-9\\.()\\s万元]+)")
     winnerReg16 = regexp.MustCompile("(中[标|选]候选人)排序[::]([1-9一二三四五六七])[\\s]+.{1,4}名称[::](.*公司)[\\s]+.{1,4}报价[::]([¥〇0-9\\.人民币零点壹贰叁肆伍陆柒捌玖拾佰仟万亿元圆角分整]+)")
     winnerReg17 = regexp.MustCompile("(报价金额|投标金额|应答含税总价|预期中标价格)[::]?[\n]?([¥〇0-9\\.人民币零点壹贰叁肆伍陆柒捌玖拾佰仟万亿元圆角分整]+)")
-    winnerReg18 = regexp.MustCompile("([中|投]标候选人[弟|第])([1-9一二三四五])[\\s]?名[::]([\u4E00-\u9FA5]{4,20})([((].*公司[))])?[,,\\s]+投标报价[::]([0-9\\.\\s万元]+)")
+    winnerReg18 = regexp.MustCompile("([中|投]标候选人[弟|第])([1-9一二三四五])[\\s]?名[::]([\u4E00-\u9FA5]{4,20})([((].*公司[))])?[,,\\s]+投标报价[::]([0-9\\.\\s 万元]+)")
     winnerReg19 = regexp.MustCompile("([弟|第][1-9一二三四五]名(中标候选人)?)[::]?([\u4E00-\u9FA5]{4,20}公司)[((]?[,,]?(报价|投标报价)[::]?([0-9\\.\\s万元]+)")
 
 
@@ -59,12 +59,23 @@ var (
 	winnerReg50 = regexp.MustCompile("(第[一二三]名)\n单位名称\n(.{4,20}公司)[\n\\s]+投标报价\n大写\n([\u4E00-\u9FA5]+)\n")
 	winnerReg51 = regexp.MustCompile("(中标候选人第[1-9一二三四五])[\\s](名)")
 	winnerReg52 = regexp.MustCompile("(中标金额[::][0-9.]+)\n([万元]+)")
+    winnerReg53 = regexp.MustCompile("中标候选人[\\s ](第一候选人)[\\s ](第二候选人)[\\s ]?(第三候选人)?\n单位名称[\\s ](.{4,20}公司)[\\s ](.{4,20}公司)[\\s ]?(.{4,20}公司)?\n投标价[((]万元[))]([\\s  ]+)([0-9.]+)([\\s  ]+)([0-9.]+)([\\s  ]+)?([0-9.]+)?")
+    winnerReg54 = regexp.MustCompile("(第[一二三1-3]中标候选人)[ \\s]([\u4E00-\u9FA5,]{4,20}公司)[ \\s](人民币|¥)([0-9,,.万元]+)")
 
 
-
+	//特殊爬虫-特殊情况
+    winnerReg80 = regexp.MustCompile("投标报价\n投标人.*\n.*[((]万元[))]\n"+
+		"(.*)[\n]?(第[1一]中标候选人).*\\s([0-9]+[.][0-9]+|[0-9]+)\n(.*司)\n" +
+		"(.*)[\n]?(第[2二]中标候选人).*\\s([0-9]+[.][0-9]+|[0-9]+)[\n]?(.*司)?")
+    winnerReg81 = regexp.MustCompile("投标报价\n[((]万元[))]\n"+
+		"(.*)[\n]?(.*司)[\\s]+(第[1一]中标候选人).*\\s([0-9]+[.][0-9]+|[0-9]+)\n" +
+		"(.*)[\n]?(.*司)[\\s]+(第[2二]中标候选人).*\\s([0-9]+[.][0-9]+|[0-9]+)\n")
+    winnerReg82 = regexp.MustCompile("投标人.*\n.*[((]万元[))]\n元[))]\n"+
+	"(.*)\\s(第[1一]中标候)\n.*\\s([0-9]+[.][0-9]+|[0-9]+)\n(.*公司)\\s(选人)\n" +
+	"(.*)\\s(第[2二]中标候)\n.*\\s([0-9]+[.][0-9]+|[0-9]+)\n(.*公司)\\s(选人)\n")
 
 //格式化中标金额换行
-    winnerReg100    = regexp.MustCompile("中标金额:[\\s]+([0-9\\.万元]+)")
+    winnerReg100  = regexp.MustCompile("中标金额:[\\s]+([0-9\\.万元]+)")
 
 
 	 //不带金额
@@ -111,6 +122,13 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 	if nswinnertabletag.MatchString(text) && !winnerReg0.MatchString(text){
 		return []map[string]interface{}{}
 	}
+
+	if codeSite=="sh_shszfhcxjsglwyh_jsgc_zhbhxrgs" {
+		text = winnerReg80.ReplaceAllString(text,"\n$2:$1$4 中标金额:$3 万元\n$6:$5$8 中标金额:$7 万元\n")
+		text = winnerReg81.ReplaceAllString(text,"\n$3:$1$2 中标金额:$4 万元\n$7:$5$6 中标金额:$8 万元\n")
+		text = winnerReg82.ReplaceAllString(text,"\n$2$5:$1$4 中标金额:$3 万元\n$7$10:$6$9 中标金额:$8 万元\n")
+	}
+
 	text = winnerReg5.ReplaceAllString(text, "\n$3:$1\n")
 	text = winnerReg20.ReplaceAllString(text,"\n${4}:${2}\n")
 	text = winnerReg21.ReplaceAllString(text,"\n${3}成交候选人:${1}\n")
@@ -124,7 +142,7 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 	text = winnerReg9.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
 	text = winnerReg10.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${2}\n")
 	text = winnerReg11.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
-	text = winnerReg12.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
+	text = winnerReg12.ReplaceAllString(text,"\n${1}:${4}\n中标金额:${6}\n")
 	text = winnerReg13.ReplaceAllString(text,"\n${1}${2}:${3}\n中标金额:${4}\n")
 	text = winnerReg15.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
 	text = winnerReg16.ReplaceAllString(text,"\n第${2}${1}:${3}\n中标金额:${4}\n")
@@ -137,9 +155,8 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 	text = winnerReg100.ReplaceAllString(text,"中标金额:${1}")
 
 	//特殊格式
-	if winnerReg14.MatchString(text) {
-		text = winnerReg14_1.ReplaceAllString(text,"\n中标候选人${1}名:${2}\n中标金额:${3}\n")
-	}
+	text = winnerReg14_1.ReplaceAllString(text,"\n中标候选人${1}名:${2}\n中标金额:${3}\n")
+
 
 
 	if winnerReg50.MatchString(text) && strings.Contains(text,"中标候选人公示") {
@@ -149,7 +166,8 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 	text = winnerReg51.ReplaceAllString(text,"${1}${2}\n中标金额:${3}\n")
 	text = winnerReg52.ReplaceAllString(text,"$1$2")
 
-
+	text = winnerReg53.ReplaceAllString(text,"\n$1:$4 中标金额:$8 万元\n$2:$5 中标金额:$10 万元\n")
+	text = winnerReg54.ReplaceAllString(text,"\n$1:$2 中标金额:$4\n")
 
 	text = clearSpace1.ReplaceAllString(text, "") //清理(1)	单位名称:成都维诺信科技有限公司-->单位名称:成都维诺信科技有限公司
 	if strings.TrimSpace(text) == "" {

+ 37 - 9
src/main.go

@@ -76,18 +76,46 @@ func main() {
 
 //验证规则
 func testMain()  {
+	//特殊-情况
+	/*
+		项目负责人姓 否决投标/ 投标报价
+	投标人 中标候选人排序 工期
+	名 入围情况 (万元)
+	上海浦兴路桥建设工程有限
+	第1中标候选人 孙天霞 365 否 18565.5918
+	公司
+	上海城建市政工程(集
+	第2中标候选人 马利锋 365 否 18616.3385
+	团)有限公司
+
+	项目负责 报价初步甄 投标报价
+	投标人 中标候选人排序 工期 否决投标
+	人姓名 别情况 (万元)
+	上海建工二建集团有限
+	第一中标候选人 杨培 540 否 16837.5217
+	公司
+	红阳建工集团有限公司 第二中标候选人 余小妮 540 否 16873.914
+	上海公路桥梁(集
+	李学卫 540 否 16949.5766
+	团)有限公司
+
+	投标报价
+	(万元)
+	中铁十四局集团有限公
+	司  第一中标候选人  陈帅华  1097  60365.2278
+	上海隧道工程有限公司  第二中标候选人  钱佳俊  1097  60352.0288
+	中铁上海工程局集团有
+	限公司  崔振兴  1097  60370.0609
+	*/
 
+	text :=``
 
 
-
-	text :=`中标候选人第1名:商丘大虞城市发展工程有限公司,投标报价:22000.417072
-万元,质量:/,工期/交货期/服务期:120天;
-      
-中标候选人第2名:河南国埔建筑工程有限公司,投标报价:22007.217056万元
-,`
-	var winnerReg12 = regexp.MustCompile("(中[标|选]候选人[弟|第][一二三四五六七八九十0-9]名|[弟|第][一二三四五六七八九十0-9](中标)?候选人)[::\\s ]+?(.*)[ \\s,,]+?(投标报价|投标总报价|金额)[::]?([0-9\\.\\s万元]+)")
-	if winnerReg12.MatchString(text) {
-		text = winnerReg12.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
+	var winnerReg82 = regexp.MustCompile("投标人.*\n.*[((]万元[))]\n元[))]\n"+
+		"(.*)\\s(第[1一]中标候)\n.*\\s([0-9]+[.][0-9]+|[0-9]+)\n(.*公司)\\s(选人)\n" +
+		"(.*)\\s(第[2二]中标候)\n.*\\s([0-9]+[.][0-9]+|[0-9]+)\n(.*公司)\\s(选人)\n")
+	if 	winnerReg82.MatchString(text) {
+		text = winnerReg82.ReplaceAllString(text,"\n$2$5:$1$4 中标金额:$3 万元\n$7$10:$6$9 中标金额:$8 万元\n")
 		log.Debug(text)
 	}else {
 		log.Debug("不匹配")