Python正则中.*为何无法匹配完整字符串?
问题:正则匹配包含换行的整个字符串失败怎么办?
运行以下代码:
my_string = 'START\r\nwords\t" Quoted Words"\r\nmore12345\t$$symbols\r\n END' pattern = '(.*)' matches = re.match(pattern, my_string) matches.groups(0)
期望输出:
('START\r\nwords\t" Quoted Words"\r\nmore12345\t$$symbols\r\n END',)
实际输出:
('START\r',)
解决方法
问题根源在于:re.match默认仅从字符串起始位置匹配,且.元字符默认不匹配换行符(\r、\n这类换行相关字符),所以匹配到第一个\r就终止了。要匹配包含换行的整个字符串,有两种实用方案:
方案一:添加re.DOTALL标志
给re.match传入re.DOTALL(或简写re.S)参数,让.可以匹配包括换行在内的所有字符:
import re my_string = 'START\r\nwords\t" Quoted Words"\r\nmore12345\t$$symbols\r\n END' pattern = '(.*)' matches = re.match(pattern, my_string, re.DOTALL) print(matches.groups(0))
方案二:修改正则表达式匹配所有字符
用[\s\S]替代.,这个表达式能匹配所有空白字符和非空白字符(等价于所有字符),无需额外标志:
import re my_string = 'START\r\nwords\t" Quoted Words"\r\nmore12345\t$$symbols\r\n END' pattern = '([\s\S]*)' matches = re.match(pattern, my_string) print(matches.groups(0))
额外提示:如果只是单纯需要得到包含整个字符串的元组,完全不需要正则,直接写(my_string,)就能得到目标结果。只有在必须使用正则的场景下,再用上面的方法。
内容的提问来源于stack exchange,提问作者whoopscheckmate
相关产品推荐
相关产品推荐

