def j2valid_trend(j): nonlocal entities_list if j < 3: return False j_tuple = j_param_types2j_latest(j, Param.Type.list()) if any(map(is_none, j_tuple)): return False entities_tuple = [ entities_list[j] if j is not None else None for j in j_tuple ] if any(map(lambda x: len(x) != 1, entities_tuple)): return False j_portlike, j_tradegood, j_rate, j_trend = j_tuple assert_equal(j_trend, j) if j_rate != j - 1: return False if j - 2 not in {j_portlike, j_tradegood}: return False entity_portlike, entity_tradegood, entity_rate, entity_trend = map( l_singleton2obj, entities_tuple) if FoxylibEntity.entity2type( entity_portlike) != PortEntity.entity_type( ): # not culture return False entity_latter = max([entity_portlike, entity_tradegood], key=FoxylibEntity.entity2span) span_latter, span_rate, span_trend = lmap( FoxylibEntity.entity2span, [entity_latter, entity_rate, entity_trend]) span_latter_rate = SpanTool.span_pair2between( span_latter, span_rate) str_between_latter_rate = StringTool.str_span2substr( text, span_latter_rate) if not RegexTool.pattern_str2match_full( RegexTool.pattern_blank_or_nullstr(), str_between_latter_rate): return False span_rate_trend = SpanTool.span_pair2between(span_rate, span_trend) str_between_rate_trend = StringTool.str_span2substr( text, span_rate_trend) if not RegexTool.pattern_str2match_full( RegexTool.pattern_blank_or_nullstr(), str_between_rate_trend): return False return True
def entity_pair2is_appendable( cls, text, entity_pair, ): Param = PriceSkillParameter entity_type_pair = lmap(FoxylibEntity.entity2type, entity_pair) param_type_pair = lmap(Param.Type.entity_type2parameter_type, entity_type_pair) for param_type in param_type_pair: if param_type not in {Param.Type.PORTLIKE, Param.Type.TRADEGOOD}: return False param_type_1, param_type_2 = param_type_pair if param_type_1 != param_type_2: return False span_pair = lmap(FoxylibEntity.entity2span, entity_pair) text_between = StringTool.str_span2substr( text, SpanTool.span_pair2between(*span_pair)) is_fullmatch = RegexTool.pattern_str2match_full( Param.pattern_delim(), text_between) if not is_fullmatch: return False return True
def str_span_pattern2match_full(cls, str_in, span, pattern): from foxylib.tools.regex.regex_tool import RegexTool str_sub = cls.str_span2substr(str_in, span) if str_sub is None: return None m = RegexTool.pattern_str2match_full(pattern, str_sub) return m
def str2token_span_list(cls, str_in): p_token = cls._pattern_token() m_list_all = list(p_token.finditer(str_in)) p_blank = cls._pattern_blank() m_list_nowhitespace = filter(lambda m: not RegexTool.pattern_str2match_full(p_blank, m.group()), m_list_all) span_list = [m.span() for m in m_list_nowhitespace] return span_list
def test_02(self): str_in = "hello world" p1 = re.compile(r"\w+ \w+") m1 = RegexTool.pattern_str2match_full(p1, str_in) self.assertIsNotNone(m1) p2 = re.compile(r"\w+ \w") m2 = RegexTool.pattern_str2match_full(p2, str_in) self.assertIsNone(m2) p3 = re.compile(r"\w \w+") m3 = RegexTool.pattern_str2match_full(p3, str_in) self.assertIsNone(m3) p4 = re.compile(r"\w* \w*") m4 = RegexTool.pattern_str2match_full(p4, str_in) self.assertIsNotNone(m4) p5 = re.compile(r"H\w* \w*D", re.I) m5 = RegexTool.pattern_str2match_full(p5, str_in) self.assertIsNotNone(m5)
def gap2valid(span): str_span = SpanTool.list_span2sublist(text_in, span) return RegexTool.pattern_str2match_full(cls.pattern_colon(), str_span)