剥去一个冗长的python正则表达式

buk*_*zor 7 python regex

我有一个详细的python正则表达式字符串(有很多空格和注释),我想转换为"正常"样式(导出到javascript).特别是,我需要这个非常可靠.如果有任何明显正确的方法来做到这一点,那就是我想要的.例如,一个天真的实现会破坏正则表达式r' \# # A literal hash character',这是不行的.

这样做的最好方法是强制python re模块给我一个非正规表示我的正则表达式,但我没有看到这样做的方法.

dpk*_*pkp 5

我相信您只需解决以下两个问题即可删除冗长的正则表达式:

  1. 删除注释到行尾
  2. 删除未转义的空格

尝试一下,用单独的正则表达式替换链接2:

import re

def unverbosify_regex_simple(verbose):
   WS_RX = r'(?<!\\)((\\{2})*)\s+'
   CM_RX = r'(?<!\\)((\\{2})*)#.*$(?m)'

   return re.sub(WS_RX, "\\1", re.sub(CM_RX, "\\1", verbose))
Run Code Online (Sandbox Code Playgroud)

上面是简化版本,保留了转义空间。结果输出将更难阅读,但应可用于正则表达式平台。

另外,对于一个稍微复杂的答案,它“转义”空格(即'\'=>'')并返回我认为大多数人期望的结果:

import re

def unverbosify_regex(verbose):
   CM1_RX = r'(?<!\\)((\\{2})*)#.*$(?m)'
   CM2_RX = r'(\\)?((\\{2})*)(#)'
   WS_RX  = r'(\\)?((\\{2})*)(\s)\s*'

   def strip_escapes(match):
      ## if even slashes: delete space and retain slashes
      if (match.group(1) is None):
         return match.group(2)

      ## if number of slashes is odd: delete slash and keep space (or 'comment')
      elif (match.group(1) == '\\'):
         return match.group(2) + match.group(4)

      ## error
      else:
         raise Exception

   not_verbose_regex = re.sub(WS_RX, strip_escapes,
                        re.sub(CM2_RX, strip_escapes,
                         re.sub(CM1_RX, "\\1",
                          verbose)))

   return not_verbose_regex
Run Code Online (Sandbox Code Playgroud)

更新:添加了注释来解释偶数斜杠计数。修复了CM_RX中的第一个组,如果斜杠计数为奇数,则保留完整的“注释”。

更新2:修复注释正则表达式,它不能正确处理转义的散列。应同时处理“ \##转义的散列”以及“带有##转义的散列的注释”和“ \\#注释”

更新3:添加了一个简化版本,不会清理转义的空格。

更新4:进一步简化以消除变长的负向后看(和反向/反向技巧)