正则匹配反馈主题优先级不符,如何设置正则匹配优先级?
正则匹配优先级调整问题
我使用正则表达式识别DataFrame中「Feedback」列的关键主题,编写了对应代码(如下):
# creating regex patterns pattern1 = re.compile(r'respond query|email|fast response|email|response time|responses email slow|long time|longer response|respond quickly email') pattern2 = re.compile(r'visibility honesty|honesty|transparency timescale|transparency|transparent') # Assigning what should be the theme patterns = { re.compile(pattern1) : 'Communication', re.compile(pattern2) : 'Transparency' } #create a function to use the patterns as input in the next step def match_pattern(text): for pattern, result in patterns.items(): if pattern.search(text): return result return '' #Applying the function to my column df['Feedback_Theme'] = df['Feedback'].apply(match_pattern)
测试反馈文本为“Transparency is required in data but emails are not received on time”时,当前返回的主题是「Communication」,但我希望优先返回「Transparency」主题。请问如何设置正则匹配的优先级,避免结果被其他正则覆盖?
解决方法
1. 调整字典的插入顺序(最直接)
Python 3.7及以上版本的字典会按插入顺序遍历,你当前的字典先放入了Communication对应的正则,导致匹配时先命中email关键词就直接返回了。只需把优先级高的规则放在字典前面:
patterns = { re.compile(r'visibility honesty|honesty|transparency timescale|transparency|transparent'): 'Transparency', re.compile(r'respond query|email|fast response|response time|responses email slow|long time|longer response|respond quickly email'): 'Communication' }
这样遍历会先检查Transparency的正则,匹配到就直接返回,不会再触发后续规则。
2. 改用列表存储规则(更可控)
如果担心字典顺序的兼容性问题(比如旧版本Python),可以把规则改成列表元组形式,明确指定优先级顺序:
# 列表中越靠前的规则,优先级越高 patterns = [ (re.compile(r'visibility honesty|honesty|transparency timescale|transparency|transparent'), 'Transparency'), (re.compile(r'respond query|email|fast response|response time|responses email slow|long time|longer response|respond quickly email'), 'Communication') ] def match_pattern(text): for pattern, result in patterns: if pattern.search(text): return result return ''
这种方式完全由你控制匹配顺序,不受字典特性影响。
3. 优化正则表达式(可选)
你的正则存在重复关键词(比如pattern1里重复的email),可以简化;同时如果需要更精准匹配,可添加单词边界避免误触发:
- 简化
pattern1:r'respond query|email|fast response|response time|responses email slow|long time|longer response|respond quickly email' - 给
Transparency的正则添加边界:r'\b(transparency|transparent|visibility honesty|honesty|transparency timescale)\b',确保匹配完整单词,减少部分匹配干扰。
内容的提问来源于stack exchange,提问作者Django0602
相关产品推荐
相关产品推荐

