Python 3.11正则捕获数据问题:匹配含换行字符串报错
问题解决:Python正则匹配换行内容报错
错误原因
你的代码报错核心有两点:
- 换行匹配逻辑错误:在Python的raw字符串(
r'')中,\\n+会被解析为字面量的\n(反斜杠+字母n),但输入字符串user_input里的\n\n是实际的换行符(ASCII换行字符),两者无法匹配,导致re.search返回None,调用group()时触发AttributeError。 - 默认模式无法匹配跨换行内容:默认正则模式下,
.不会匹配换行符,即便修正了换行匹配,最后一个分组(.*$)也无法捕获换行后的文本内容。
修正方案
方案1:修正换行匹配并启用DOTALL模式
将正则中的\\n+改为\n+(raw字符串中\n直接匹配实际换行),同时添加re.DOTALL标志让.可以匹配换行符:
import re user_input = '**Suggested by <@1234567890> (ID: 1234567890)**\n\ntesting new idea' # 修正正则:替换\\n+为\n+,添加re.DOTALL regex = re.compile(r'\*\*Suggested by \<\@(.*?)\> \(ID\: (.*?)\)\*\*\n+(.*)', re.DOTALL) content = re.search(regex, user_input) if content: print(content.group(1)) # 输出:1234567890 print(content.group(2)) # 输出:1234567890 print(content.group(3)) # 输出:testing new idea
方案2:严格匹配两个换行(按你提到的规避方式)
如果要固定匹配两个换行,把\n+换成\n\n,同样搭配re.DOTALL:
regex = re.compile(r'\*\*Suggested by \<\@(.*?)\> \(ID\: (.*?)\)\*\*\n\n(.*)', re.DOTALL)
方案3:无需DOTALL,用[\s\S]*匹配所有字符
[\s\S]表示匹配所有空白和非空白字符(等价于所有字符),可以替代.*,无需额外标志:
regex = re.compile(r'\*\*Suggested by \<\@(.*?)\> \(ID\: (.*?)\)\*\*\n+([\s\S]*)')
额外提示
添加if content:判断可以避免匹配失败时的报错,让代码更健壮。
内容的提问来源于stack exchange,提问作者luci
相关产品推荐
相关产品推荐

