输入包含换行符时正则搜索失败,最优解决方法是什么?
问题根因
你当前遇到的匹配失败核心原因是Python正则默认配置下,元字符.不匹配换行符\n。你提供的text变量包含真实换行符,match关键词位于第二行、fail关键词位于第三行,中间被换行符分隔,.*match.*匹配到match之后,后续的.遇到换行符就停止匹配,自然找不到后面的fail。
现有方案的缺陷
- 把
text改为repr(text):本质是把原文本中的转义字符转换成了字面量字符,原本的换行符\n会被转成\和n两个普通字符,相当于修改了原始输入内容,如果你的业务场景本身需要处理带真实换行的文本,这个方案完全不适用。 - 把
text赋值为原始字符串r'\ntestmatch\ntestfail':和上面的问题一致,只是在定义文本的时候就把\n变成了普通字符,没有真实换行存在,属于绕过了「跨行匹配」的真实需求,不是通用解决方案。
最佳解决方案
如果你的需求就是要在包含真实换行的文本中,跨多行匹配满足规则的内容,只需要在编译正则时添加re.DOTALL(别名re.S)标志即可,该标志会让元字符.匹配包括换行符在内的所有字符:
import re regex = '.*match.*fail.*' # 增加re.DOTALL标志实现跨行匹配 pattern = re.compile(regex, re.DOTALL) text = '\ntestmatch\ntestfail' match = pattern.search(text) # 此时match会正常返回匹配结果
如果你的规则里不需要匹配开头、结尾的多余内容,还可以简化正则写法,去掉首尾的.*,直接用match.*fail搭配re.DOTALL即可,匹配效率更高。
内容的提问来源于stack exchange,提问作者Welison Almeida
相关产品推荐
相关产品推荐

