zhengkun %!s(int64=3) %!d(string=hai) anos
pai
achega
0ab0b2742a

+ 9 - 0
src/jy/clear/tonumber.go

@@ -44,6 +44,9 @@ var blackMoneyClean =  regexp.MustCompile("^([0-9.]+以下[万]?|分)$")
 var impactMoneyClean =  regexp.MustCompile("(分二串口|分站模块)")
 //大写金额补充
 var impactMoneyeplenish =  regexp.MustCompile("^([壹贰叁肆伍陆柒捌玖]分)")
+//特殊金额-格式-重置
+var resetAamountReg =  regexp.MustCompile("[.](0|00)[.](0|00)")
+
 
 func init() {
 	regOperator, _ = regexp.Compile(`[*|+|)*)]`)
@@ -145,6 +148,12 @@ func ObjToMoney(data []interface{}, spidercode ...string) []interface{} {
 		totmpstr = unpkvBidamountReg.ReplaceAllString(totmpstr,"")
 		(data)[0] = totmpstr
 	}
+
+	if resetAamountReg.MatchString(totmpstr) {
+		totmpstr = resetAamountReg.ReplaceAllString(totmpstr,".0")
+		(data)[0] = totmpstr
+	}
+
 	//单位指定
 	if regUnitMoneyClean.MatchString(totmpstr) {
 		totmpstr = regUnitMoneyClean.ReplaceAllString(totmpstr,"$2")

+ 103 - 4
src/jy/pretreated/analystep.go

@@ -8,6 +8,7 @@ import (
 	"fmt"
 	"jy/clear"
 	"jy/util"
+	qu "qfw/util"
 	"regexp"
 	"strings"
 
@@ -32,9 +33,80 @@ var formattext5 = regexp.MustCompile("投标报价[::]包件1[::][0-9.万元
 var formattext6  = regexp.MustCompile("(投标报价[::][0-9.]+)\n([万元]+)")
 
 
+var formattext10  = regexp.MustCompile(".*包号\n.*\n.*供应商名称\n.*\n.*(成交|中标)金额\n(.*单位\n)?" +
+	"<td.*>(.*)\n(<td>\n)?.*\n<td.*>[\n]?(.*公司)\n.*\n<td.*>([0-9.,,万元]+)\n")
+
+//特殊文本提取-计算
+var formattext50  = regexp.MustCompile("主要标的数量[::]([0-9.]+)\n主要标的单价[::]([0-9.]+)\n合同金额[::].*\n履约期限")
+
+//特殊文本提取有效
+var formattext100  = regexp.MustCompile("项目编号.*\n项目名称.*\n招标单位.*\n招标代理.*\n中标单位.*\n项目编号.*\n总价[((]万元[))]([0-9.]+)")
+/*
+	项目编号JG2020-4278-003
+	项目名称株洲站改扩建工程(第五批)建管甲供物资(通信、信息专业)招标(ZZXX-02包件 安检仪等 WZ-2020-56)
+	招标单位中国铁路广州局集团有限公司长沙工程建设指挥部
+	招标代理中铁物总国际招标有限公司
+	中标单位广州同视电子设备有限公司
+	项目编号JG2020-4278-003
+	总价(万元)249.2
+*/
+
 //特别处理-表格数据
 var tablePackageWinnerReg = regexp.MustCompile("[\n]?(成交侯选人|第一中标候选人)[::](.{4,15}(公司|厂))")
 
+//特殊-爬虫文本-抽取单价数量-并计算
+func dealWithSpecStructToSpiderCode(text string) string {
+	text = formattext50.ReplaceAllString(text,"$1&&$2")
+	arr := strings.Split(text,"&&")
+	if len(arr)==2 {
+		one := qu.Float64All(arr[0])
+		two := qu.Float64All(arr[1])
+		if one>0 && two>0 {
+			return fmt.Sprintf("\n合同金额:%f\n",one*two)
+		}
+	}
+	return ""
+}
+//对比前后候选人的有效性-true -为新
+func thanWinnerOrderEffective(old_order []map[string]interface{},new_order []map[string]interface{})bool {
+	if len(new_order)==0 || new_order == nil {
+		return false
+	}
+	if len(old_order) == 0 || old_order == nil {
+		return true
+	}
+	old_info,new_info := old_order[0],new_order[0]
+	if qu.IntAll(old_info["sort"])>1 {return true}//排序比对
+	if qu.IntAll(new_info["sort"])>1 {return false}
+
+	//金额比对 -
+	isuse_1,isuse_2 := false,false
+	if old_vf, ok := old_info["price"].(float64); ok && old_vf>0.0 {
+		isuse_1 = true
+	}else {
+		if old_vs, ok := old_info["price"].(string); ok && old_vs!="" {
+			isuse_1 = true
+		}
+	}
+	if new_vf, ok := new_info["price"].(float64); ok && new_vf>0.0 {
+		isuse_2 = true
+	}else {
+		if new_vs, ok := new_info["price"].(string); ok && new_vs!="" {
+			isuse_2 = true
+		}
+	}
+	if isuse_1 && !isuse_2 {
+		return false
+	}
+	if !isuse_1 && isuse_2 {
+		return true
+	}
+	//均正常-优先取新值
+	return true
+}
+
+
+
 //分析方法
 func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 	con := job.Content
@@ -54,6 +126,20 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 	con = formattext5.ReplaceAllString(con,"中标金额:${2}\n")
 	con = formattext6.ReplaceAllString(con,"$1$2")
 
+	//改变特殊结构
+	con = formattext10.ReplaceAllString(con,"\n分包$3\n中标单位:$5 中标金额:$6\n")
+
+
+	//指定爬虫-特殊结构-计算抽取
+	if codeSite=="a_zgzfcgw_zfcghtgg_new" {
+		str :=  formattext50.FindString(con)
+		if str!="" {
+			new_str := dealWithSpecStructToSpiderCode(str)
+			if new_str!="" {
+				con = new_str+con
+			}
+		}
+	}
 
 	con = formatText(con, "all")
 	job.Content = con
@@ -90,12 +176,15 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 			if isUnRulesTab { //是否不规则表格
 				job.IsUnRulesTab = isUnRulesTab
 			}
+
 			//新加 未分块table中未能解析到中标候选人,从正文中解析-全文匹配一次
 			if (job.Winnerorder == nil || len(job.Winnerorder) == 0 ) || len(job.Winnerorder) > 8 {
 				//表格没有划分时候:-纯文本匹配
 				tmp_text := HtmlToText(bl.Text)
 				bl.Winnerorder = winnerOrderEntity.Find(tmp_text, true, 1, isSite, codeSite)
-				job.Winnerorder = bl.Winnerorder
+				if thanWinnerOrderEffective(job.Winnerorder,bl.Winnerorder){
+					job.Winnerorder = bl.Winnerorder
+				}
 			}
 
 			//无分包-附件-格式化文本处理-
@@ -144,6 +233,15 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 				bl.Text = bl.Text[:strings.Index(bl.Text, "业绩")]
 			}
 		}
+
+		//特殊-指定处理-结构转化formattext100
+		if formattext100.MatchString(bl.Text) {
+			new_str := formattext100.FindString(bl.Text)
+			new_str = formattext100.ReplaceAllString(new_str,"$1")
+			bl.Text =fmt.Sprintf("中标金额:%s万元\n",new_str)+bl.Text
+		}
+
+
 		//调用kv解析库-处理detail
 		bl.Text = formatText(bl.Text, "all")
 		//处理 :
@@ -153,7 +251,9 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 		//新加 未分块table中未能解析到   中标候选人,从正文中解析
 		if job.Winnerorder == nil || len(job.Winnerorder) == 0 || len(job.Winnerorder) > 8 {
 			bl.Winnerorder = winnerOrderEntity.Find(bl.Text, true, 1, isSite, codeSite)
-			job.Winnerorder = bl.Winnerorder
+			if thanWinnerOrderEffective(job.Winnerorder,bl.Winnerorder){
+				job.Winnerorder = bl.Winnerorder
+			}
 		}
 
 		//如果表格查询分包-有分包-但是没有有效值的话 ,正文重新查找
@@ -172,12 +272,11 @@ func AnalyStart(job *util.Job, isSite bool, codeSite string) {
 				job.BlockPackage = FindPackageFromText(job.Title, bl.Text, isSite, codeSite)
 			}
 		}
-
-
 		job.Block = append(job.Block, bl)
 	}
 }
 
+
 func processTableInBlock(bl *util.Block, job *util.Job, isSite bool, codeSite string) bool {
 	//块中再查找表格(块,处理完把值赋到块)
 	//bl.Text = formatText(bl.Text, "biangeng")

+ 95 - 43
src/jy/pretreated/analytable.go

@@ -253,6 +253,25 @@ func isRepeatArrString(arr1,arr2 []string)bool{
 	}
 	return is_r
 }
+//中标金额-单位-同时存在-且万元-重构
+func isResetUnitAmountSortKV(table *Table) {
+	isUnitAmount := 0
+	for _, k := range table.SortKV.Keys {
+		v := table.SortKV.Map[k]
+		if new_v, ok := v.(string); ok&&(k=="中标金额"||k=="单位") {
+			if k=="单位" && new_v=="万元" {
+				isUnitAmount++
+			}
+			if k=="中标金额" && MoneyReg.MatchString(new_v) && !strings.Contains(new_v,"万") {
+				isUnitAmount++
+			}
+		}
+	}
+	if isUnitAmount>1 {
+		table.SortKV.Map["中标金额"] = qutil.ObjToString(table.SortKV.Map["中标金额"])+"万元"
+	}
+}
+
 
 //对解析后的表格的kv进行过滤
 func (table *Table) KVFilter(isSite bool, codeSite string) {
@@ -265,6 +284,9 @@ func (table *Table) KVFilter(isSite bool, codeSite string) {
 	table.analyTdKV() //1.遍历每行每列td的sortkv添加到table.SorkVK中;2.td有子表格的处理
 	as := NewSortMap()
 
+	//中标金额-单位-同时存在-且万元-重构
+	isResetUnitAmountSortKV(table)
+
 	//遍历table.sortkv,进行过滤处理,并放入标准化KV中,如果值是数组跳到下一步处理
 	pre_k := ""
 	for _, k := range table.SortKV.Keys {
@@ -387,7 +409,7 @@ func (table *Table) KVFilter(isSite bool, codeSite string) {
 	}
 }
 
-var winMoneyReg *regexp.Regexp = regexp.MustCompile("(报价|投标价|投标总价)")
+var winMoneyReg *regexp.Regexp = regexp.MustCompile("(报价|投标价|投标总价|总金额)")
 var winNoMoneyReg *regexp.Regexp = regexp.MustCompile("(得分|时间|序号)")
 //处理table.SortKV.value为数组的情况
 func (table *Table) sortKVArr(as *SortMap, isSite bool, codeSite string) {
@@ -1402,7 +1424,7 @@ func (table *Table) ComputeRowColIsKeyRation(isSite bool, codeSite string) {
 							ration1, _ := table.StartAndEndRation[ck].GetTDRation(td)
 							if !checkCompute[ck] {
 								checkCompute[ck] = true
-								if ration1 >= checkval && td.ColPos != 1 {
+								if ration1 >= checkval && td.ColPos != 1  {
 									for _, tr1 := range table.TRs {
 										for _, td1 := range tr1.TDs {
 											if td1.StartCol == td.StartCol {
@@ -1574,8 +1596,7 @@ func (table *Table) FindKV(isSite bool, codeSite string) {
 		//sort := 1
 		nextdirect, nextvdirect := 0, 0
 		//开始抽取
-		//若第一排全为头-临时让第二排-新增 左临 查询,zhengkun
-		tb_first_allhead := false
+		than_once_1,than_once_2 := false,false
 		for tr_index, tr := range table.TRs {
 			if tr_index==0 {
 				//fmt.Println("调试")
@@ -1593,7 +1614,7 @@ func (table *Table) FindKV(isSite bool, codeSite string) {
 				}
 				if numbh != 0 && numbh == len(tr.TDs) { //5e0d53ef0cf41612e0640495
 					if tr_index==0 {
-						tb_first_allhead = true
+						than_once_1,than_once_2 = true,true
 					}
 					nextdirect, nextvdirect = 2, 1
 					continue
@@ -1609,33 +1630,16 @@ func (table *Table) FindKV(isSite bool, codeSite string) {
 			for _, td := range tr.TDs {
 				if !td.BH && td.KVDirect < 3 {
 					if !table.FindTdVal(td, direct, vdirect) { //table.FindTdVal()存储了table.SortKV
-						if !table.FindTdVal(td, vdirect, direct) {
-							//都识别不到时,对第一、二中标候选人的处理
-							//bo, res := GetBidOrder(td, bodirect, sort)
-							//if res {
-							//	sort++
-							//	bodirect = bo
-							//}
-							//if len(td.SortKV.Map) > 0 {
-							//	for _, tdv := range td.SortKV.Keys {
-							//		if tdv == "" || td.SortKV.Map[tdv] == "" { //value为空或者null不再添加到table.SortKV
-							//			continue
-							//		}
-							//		table.SortKV.AddKey(tdv, td.SortKV.Map[tdv])
-							//	}
-							//}
-						}
+						table.FindTdVal(td, vdirect, direct)
 					}
-					if tb_first_allhead && tr_index==1 { //临时-让第二排-向左比对
-						if !table.FindTdVal(td, 1, 2) { //table.FindTdVal()存储了table.SortKV
-							if !table.FindTdVal(td, vdirect, direct) {
-
-							}
-						}
-						tb_first_allhead = false
+					if than_once_1 && tr_index==1 {
+						table.FindTdVal(td, 1, 2)  //table.FindTdVal()存储了table.SortKV
+						than_once_1 = false
+					}
+				}else {
+					if than_once_2 && tr_index==1 && td.BH && findCandidate.MatchString(td.Val){
+						table.FindTdVal(td, 1, 2) //特殊计算表头异常-情况
 					}
-					//fmt.Println("td:", td.Val, td.BH, td.HeadTd, td.KVDirect)
-
 				}
 			}
 			nextdirect, nextvdirect = 0, 0
@@ -1873,7 +1877,10 @@ func GetBidSort(str string, n int) int {
 
 var cleardwReg *regexp.Regexp = regexp.MustCompile("[((]{1}\\d*[人元件个公斤户]/[人元件个公斤户][))]")
 var zbhxrReg *regexp.Regexp = regexp.MustCompile("(中标候选人|投标单位名称)")
-var zbhxrSortReg *regexp.Regexp = regexp.MustCompile("([第|弟][0-9一二三四五]名)")
+var zbhxrSortReg *regexp.Regexp = regexp.MustCompile("([第|弟][1-3一二三]名)")
+var zbhxrSortNameReg *regexp.Regexp = regexp.MustCompile("(中标候选人[第|弟][1-3一二三]名)|[第|弟][1-3一二三]中标候选人")
+var zbhxrSecondReg *regexp.Regexp = regexp.MustCompile("(中标候选人[第|弟][2二]名)|[第|弟][2二]中标候选人")
+
 
 //查找每一个单元格的表头,调用FindNear
 func (table *Table) FindTdVal(td *TD, direct, vdirect int) (b bool) {
@@ -1887,22 +1894,65 @@ func (table *Table) FindTdVal(td *TD, direct, vdirect int) (b bool) {
 		td.KVDirect = direct
 		key := repSpace.ReplaceAllString(near.Val, "")
 		if key == "名称" && near.StartCol == 0 && near.Rowspan > 0 {
-			for _, vn := range table.TRs[near.Rowspan-1].TDs {
-				if strings.Contains(vn.Val, "代理") {
-					key = "代理机构"
-					break
-				} else if strings.Contains(vn.Val, "招标") {
-					key = "采购单位"
-					break
-				} else if strings.Contains(vn.Val, "中标") {
-					key = "中标单位"
-					break
+			new_key := ""
+			tr := table.TRs[:td.TR.RowPos]
+			if len(tr)>len(tr)-1 {
+				tds := tr[len(tr)-1].TDs
+				if len(tds)>td.EndCol {
+					td1 := tds[td.EndCol]
+					if zbhxrSecondReg.MatchString(td1.Val) {
+						new_key = td1.Val
+					}
+				}
+			}
+			if new_key=="" {
+				for _, vn := range table.TRs[near.Rowspan-1].TDs {
+					if strings.Contains(vn.Val, "代理") {
+						key = "代理机构"
+						break
+					} else if strings.Contains(vn.Val, "招标") {
+						key = "采购单位"
+						break
+					} else if strings.Contains(vn.Val, "中标") {
+						key = "中标单位"
+						break
+					}
 				}
+			}else {
+				key = new_key
 			}
 		} else if zbhxrReg.MatchString(key) && findCandidate2.MatchString(td.Val) {
-			//if !hxrRex.MatchString(key) {
-				key = "中标单位"
+			new_key := "中标单位"
+			tr_top := table.TRs[:td.TR.RowPos]
+			if len(tr_top)>len(tr_top)-1 { //上临查询
+				tds := tr_top[len(tr_top)-1].TDs
+				if len(tds)>td.EndCol {
+					td1 := tds[td.EndCol]
+					if zbhxrSortNameReg.MatchString(td1.Val) {
+						new_key = td1.Val
+					}else {
+						if zbhxrSortReg.MatchString(td1.Val) {
+							new_key = "中选候选人"+td1.Val
+						}
+					}
+				}
+			}
+			//if new_key=="中标单位" {
+			//	tr_left := table.TRs[:td.TR.RowPos+1] //左临查询
+			//	tds := tr_left[len(tr_left)-1].TDs
+			//	if td.EndCol-1 >=0 {
+			//		td1 := tds[td.EndCol-1]
+			//		if zbhxrSortNameReg.MatchString(td1.Val) {
+			//			new_key = td1.Val
+			//		}else {
+			//			if zbhxrSortReg.MatchString(td1.Val) {
+			//				new_key = "中选候选人"+td1.Val
+			//			}
+			//		}
+			//	}
 			//}
+
+			key = new_key
 		} else if key == "单位名称" {//左临上临-拼接
 			tmpnewnear := table.FindNear(near, 1)
 			if tmpnewnear == nil {
@@ -1919,6 +1969,8 @@ func (table *Table) FindTdVal(td *TD, direct, vdirect int) (b bool) {
 				}
 			}
 		}
+
+
 		if near.Val == "" {
 			key = fmtkey("k", near.TR.RowPos, near.ColPos)
 		}

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

@@ -139,7 +139,7 @@ func DivideBlock(tp, content string, from int, ruleBlock *util.RuleBlock, isSite
 	defer qutil.Catch()
 	returnValue := 0
 	var blocks []*util.Block
-	if strings.TrimSpace(content) == "" || codeSite == "a_zgyc_ztbxx" {
+	if strings.TrimSpace(content) == "" || codeSite == "a_zgyc_ztbxx" || codeSite=="a_gyzbgfyxgs_zbjg" {
 		return blocks, -1
 	}
 	//table里面的内容不考虑,先把table清理掉

+ 28 - 1
src/jy/pretreated/winnerorder.go

@@ -44,7 +44,7 @@ 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万元]+)")
@@ -53,6 +53,10 @@ var (
     winnerReg17 = regexp.MustCompile("(报价金额|投标金额|应答含税总价|预期中标价格)[::]?[\n]?([¥〇0-9\\.人民币零点壹贰叁肆伍陆柒捌玖拾佰仟万亿元圆角分整]+)")
     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万元]+)")
+    winnerReg19_1 = regexp.MustCompile("(第[一二三1-3]候选人)[::]([\u4E00-\u9FA5()()]{4,25}公司)[((]([0-9.,,万元]+)[))]")
+
+
+
 
 
 	//特殊格式转化
@@ -61,6 +65,7 @@ var (
 	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,,.万元]+)")
+    winnerReg55 = regexp.MustCompile("排序\\s(中标候选人)名称\\s投标报价.*\n([1一])[\\s]+(.{4,20}公司)[\\s]+([0-9.]+).*\n([2二])[\\s]+(.{4,20}公司)[\\s]+([0-9.]+).*\n")
 
 
 	//特殊爬虫-特殊情况
@@ -77,6 +82,11 @@ var (
 //格式化中标金额换行
     winnerReg100  = regexp.MustCompile("中标金额:[\\s]+([0-9\\.万元]+)")
 
+	//清洗影响候选人-抽取的文本
+	cleanWinnerReg1 = regexp.MustCompile("第[一二三123]中标候选人项目业绩[::]")
+
+
+
 
 	 //不带金额
 	winnerReg20     = regexp.MustCompile("(中标单位候选人名称)[\\s]+(.*)[\\s]+(中标候选人单位名次)[\\s]+([弟|第][一二三四五六七八九十0-9]中标人)")
@@ -129,6 +139,11 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 		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")
@@ -149,6 +164,11 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 	text = winnerReg17.ReplaceAllString(text,"\n中标金额:${2}\n")
 	text = winnerReg18.ReplaceAllString(text,"\n${1}${2}名:${3}\n中标金额:${5}\n")
 	text = winnerReg19.ReplaceAllString(text,"\n${1}:${3}\n中标金额:${5}\n")
+	text = winnerReg19_1.ReplaceAllString(text,"\n$1:$2 中标金额:$3\n")
+
+
+
+
 
 
 	//中标金额格式化
@@ -168,6 +188,13 @@ func (wo *WinnerOrderEntity) Find(text string, flag bool, from int, isSite bool,
 
 	text = winnerReg53.ReplaceAllString(text,"\n$1:$4 中标金额:$8 万元\n$2:$5 中标金额:$10 万元\n")
 	text = winnerReg54.ReplaceAllString(text,"\n$1:$2 中标金额:$4\n")
+	text = winnerReg55.ReplaceAllString(text,"\n第$2$1\n中标单位:$3 中标金额:$4\n第$5$1\n中标单位:$6 中标金额:$7\n\n")
+
+
+	//清洗一下影响候选人-抽取的文字
+	text = cleanWinnerReg1.ReplaceAllString(text,"")
+
+
 
 	text = clearSpace1.ReplaceAllString(text, "") //清理(1)	单位名称:成都维诺信科技有限公司-->单位名称:成都维诺信科技有限公司
 	if strings.TrimSpace(text) == "" {

+ 5 - 40
src/main.go

@@ -76,46 +76,11 @@ 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 :=``
-
-
-	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")
+	text :=`中标候选人:第一候选人:中国铁路通信信号上海工程局(集团)有限公司(738.5083万元);评标得分:91.3835;项目经理(项目负责人):江志聪;执业证书编号:沪13106085689;承诺质量目标:符合铁路建设标准;承诺工期:60日历天;第二候选人:通号工程局集团有限公司(738.4852万元);评标得分:90.9573;项目经理(项目负责人):张庆忠;执业证书编号:京111091015510;承诺质量目标:符合铁路建设标准;承诺工期:60日历天;第三候选人:中铁电气化局集团第三工程有限公司(738.417万元);评标得分:89.804;项目经理(项目负责人):丁行南;执业证书编号:豫141060700799;承诺质量目标:符合铁路建设标准;承诺工期:60日历天;
+`
+	var winnerReg19_1 = regexp.MustCompile("(第[一二三1-3]候选人)[::]([\u4E00-\u9FA5()()]{4,25}公司)[((]([0-9.,,万元]+)[))]")
+	if 	winnerReg19_1.MatchString(text) {
+		text = winnerReg19_1.ReplaceAllString(text,"\n$1:$2 中标金额:$3\n")
 		log.Debug(text)
 	}else {
 		log.Debug("不匹配")