正则实现文本模块前两词及第二个词前三字母匹配的方法
正则实现多词模块宽松匹配方案
规则落地逻辑
需求可通过单条正则覆盖全部命中场景,不需要多层分支判断,核心匹配规则如下:
- 对每个长度≥3的目标多词模块,仅取前两个词作为匹配锚点
- 第一个词要求完整匹配
- 第二个词仅要求前3个字母匹配,后续字符任意(包括无后续字符,即3字母缩写场景)
- 匹配时忽略大小写,两个词之间要求有空白字符分隔,增加单词边界避免跨词、子串误匹配
单条正则可同时覆盖三类命中场景:
- 文本包含完整目标模块(如
beach vibe some)- 文本仅包含模块前两个完整词(如
beach vibe)- 文本中第二个词为3字母缩写形式(如
beach vib、floating pow)
正则构造方式
对每个目标模块,按如下模板生成正则:
- 拆分模块得到前两个词
word1、word2 - 拼接得到正则片段:
rf'\b{re.escape(word1)}\s+{re.escape(word2[:3])}\w*\b'
- 加入
re.escape()是为了兼容目标词含正则特殊字符(如.、*)的场景,避免语法报错 - 若需要避免长词误匹配(比如不想把
vibration匹配为vibe),可将\w*替换为{0, len(word2)-3},限制第二个词的最大长度
优化后实现代码
提前预编译所有目标模块的正则,避免逐行计算的性能损耗,代码如下:
import pandas as pd import re d = { "customerId": [1, 1, 1, 3, 3], "text": ["please use beach vibe some", "you should use beach vibe", "right use beach vib", 'use floating pow', 'use floating stuff right now'], "element": ['beach vibe some', 'beach vibe some', 'beach vibe some', 'floating power', 'floating stuff'] } df = pd.DataFrame(data=d) df['code'] = df['element'].astype('category').cat.codes # 预生成正则与编码的映射,避免重复计算 element_patterns = [] for ele in df['element'].unique(): words = ele.split() word1, word2 = words[0], words[1] pattern = rf'\b{re.escape(word1)}\s+{re.escape(word2[:3])}\w*\b' target_code = df.loc[df['element']==ele, 'code'].iloc[0] element_patterns.append( (re.compile(pattern, re.IGNORECASE), target_code) ) def match_target(text): for pattern, code in element_patterns: if pattern.search(text): return code return 999 # 无匹配时的默认值 df['test'] = df['text'].apply(match_target) print(df)
运行结果
输出与预期完全一致:
customerId text element code test 0 1 please use beach vibe some beach vibe some 0 0 1 1 you should use beach vibe beach vibe some 0 0 2 1 right use beach vib beach vibe some 0 0 3 3 use floating pow floating power 1 1 4 3 use floating stuff right now floating stuff 2 2
内容的提问来源于stack exchange,提问作者Pyyyyt
相关产品推荐
相关产品推荐

