Python中如何正确拆分长正则表达式为多行且保持正常运行?
错误原因
你当前的写法存在问题,核心原因是你使用了r开头的原始字符串,反斜杠续行后,后续行的缩进空格会被直接计入正则表达式的匹配规则中,相当于给每个路径前缀规则前加了多余的空白字符,导致正则匹配逻辑和你预期不符。
正确的多行格式化方案
方案1:相邻字符串自动拼接(最通用,无额外依赖)
Python会自动拼接多个相邻的字符串字面量,不需要额外运算符,也不会引入多余空白字符,写法如下:
patterns = re.compile( r'(^/afs|' r'^/pkg|' r'^/bin|' r'^/dev|' r'^/etc|' r'^/usr|' r'^/usr2|' r'^/sys|' r'^/sbin|' r'^/proc)' )
方案2:使用re.VERBOSE标志(适合复杂正则,可读性更高)
re.VERBOSE(也可写为re.X)标志会让正则引擎忽略表达式中的空白字符和#开头的注释,你可以直接把正则拆成多行排版:
patterns = re.compile(r''' (^/afs| ^/pkg| ^/bin| ^/dev| ^/etc| ^/usr| ^/usr2| ^/sys| ^/sbin| ^/proc) ''', re.VERBOSE)
注意:如果你的正则本身需要匹配空格,使用该模式时需要对空格做转义处理,当前场景无匹配空格的需求可以放心使用。
方案3:列表动态拼接(可维护性最高)
如果后续需要频繁增删匹配的路径前缀,可以把前缀单独存为列表,动态生成正则:
prefixes = ['/afs', '/pkg', '/bin', '/dev', '/etc', '/usr', '/usr2', '/sys', '/sbin', '/proc'] # Python 3.6+ 写法 patterns = re.compile(rf'^({"|".join(prefixes)})') # 兼容低版本写法 # patterns = re.compile(r'^(%s)' % '|'.join(prefixes))
内容的提问来源于stack exchange,提问作者Jason T.
相关产品推荐
相关产品推荐

