Python使用re.VERBOSE定义多行正则出现多余换行符的解决方法
问题根因
你写的多行正则出现多余\n是两个写法错误叠加导致的:
- Python三引号原始字符串(
r'''...''')中,字符串内的换行会被直接保留为字面量\n字符,你在每行末尾额外加的反斜杠不会触发Python原生的字符串行拼接,反而会被当成字面量反斜杠存入字符串,最终就出现了你看到的\\n冗余内容。 - 你对
re.VERBOSE的作用逻辑理解有偏差:该标志本身就会自动忽略正则中不在字符类([])内的所有空白字符(包括换行、空格、制表符),以及#开头的注释内容,不需要手动加反斜杠做行转义。
正确写法
直接按逻辑分段换行书写即可,不需要加任何行尾转义符,还可以搭配注释提升可读性:
import re pat = re.compile(r''' (?P<host>(\d{1,3}\.){3}\d{1,3}) # 匹配IP格式的host字段 ( - ) # 匹配固定的" - "分隔段 (?P<user_name>(\w+|-)) # 匹配用户名字段,支持-作为占位符 . ''', re.VERBOSE)
注意事项
re.MULTILINE和多行书写正则完全无关:这个标志的作用是修改^/$的匹配规则,让它们可以匹配每一行的首尾,而非整个字符串的首尾,不需要为了多行写正则特意添加该标志。- 开启
re.VERBOSE后如果需要匹配真实的空白字符(比如空格、换行),不能直接书写空白,要把空白放在字符类中(比如匹配空格写[ ]),或者使用转义形式(比如\、\n)。 - 原始字符串前缀
r只是让Python不解析字符串内的反斜杠转义,不会帮你忽略三引号内的换行,换行是否被当成正则有效内容,完全由re.VERBOSE标志处理。
内容的提问来源于stack exchange,提问作者sergiohzlz
相关产品推荐
相关产品推荐

