我正在尝试匹配像
这样的电子邮件页脚- 谢谢,
- 对
- 谢谢,问候,
在正则表达式的帮助下,我能够得到前2个情况,
({language_keyword_footer[0]}|{language_keyword_footer[1]}(.*?)(S+(.*?)))
语言关键字页脚是我创建的元数据,以便将来添加更多的案例,
keywords = {
"en": {'header':["From:", "Subject:"],'footer':["Regards,", "Thanks,","Thanks & Regards,"]}}
问题是当我使用这种方法时,它只捕获Regards,
并丢弃Thanks & Regards,
是否有一种方法可以将其添加到现有的re
并捕获此空格分隔的场景,任何帮助都是感激的
您需要按长度按递减顺序对项目进行排序,因为NFA正则表达式引擎中的交替模式遵循"先匹配,先服务";原则(参见"记住正则表达式引擎是急切的");文章)。另外,不要忘记转义正则表达式中用作文字模式的字符串。
你可以用
pattern = r'({})(.*?)(S+)'.format("|".join(map(re.escape, sorted(language_keyword_footer, key=len, reverse=True))))
结果模式看起来像这里的(Thanks & Regards,|Regards,|Thanks,)(.*?)(S+)
,并且将匹配Thanks & Regards,
,Regards,
或Thanks,
(在第1组中),然后匹配除换行符之外的任何零或多个字符尽可能少(在第2组中),然后匹配一个或多个非空白字符(与(S+)
)。
注意,在regex模式末尾的.*?
对最终结果没有影响。