使用re.findall()和re.escape()匹配含元字符的字符串返回空如何解决?
问题原因
你的匹配失败来自两个典型错误:
- 对
re.findall的第二个参数(待搜索的原始文本)错误使用了re.escape转义:re.escape的作用是将字符串中的正则元字符(比如(、)、*这类有特殊匹配逻辑的符号)转义为普通字面量,这个操作仅需要作用在作为正则匹配模式的第一个参数上即可。你对原始字符串line也做了转义后,原文本里的所有元字符前都被额外加上了反斜杠,和转义后的模式字符串完全无法匹配,最终返回空结果。 - 你给出的
line2定义末尾多了一个多余的空格,而原始line中对应子串的末尾直接跟随右括号,没有这个空格,也会导致匹配不成立。
解决方法
方案1:无需正则,直接用字符串原生方法
如果你的需求只是匹配固定子串,完全不需要用到正则,直接用Python字符串内置方法即可,性能更高也不容易出错:
# 先清理line2首尾冗余空格 clean_line2 = line2.strip() # 判断是否存在 if clean_line2 in line: print("匹配成功") # 直接提取子串 match_result = clean_line2
方案2:正确使用正则匹配
如果确实需要通过正则实现匹配,仅对作为匹配模式的line2做转义,原始搜索文本line不要转义,同时清理line2的冗余空格:
import re clean_line2 = line2.strip() result = re.findall(re.escape(clean_line2), line)
执行后即可得到你想要的匹配结果。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

