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

时间:2013-02-14 22:54:14

标签: python regex

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

执行此操作的最佳方法是强制python re模块给我一个非正则表示我的正则表达式,但我没有办法做到这一点。

1 个答案:

答案 0 :(得分:4)

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

  1. 删除评论到行尾
  2. 删除未转义的空白
  3. 尝试这个,将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))
    

    上面是一个简化版本,它将转义的空格保留原样。结果输出将更难阅读,但应该适用于正则表达式平台。

    或者,对于一个稍微复杂的答案,“unes​​capes”空格(即'\'=&gt;'')并返回我认为大多数人期望的内容:

    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
    

    UPDATE:添加了评论来解释甚至v。奇数斜线计数。修复了CM_RX中的第一个组,如果斜线计数为奇数,则保留完整的“注释”。

    更新2:修正了注释正则表达式,它没有正确处理转义哈希值。应该同时处理“\ ##escaped hash”以及“#with with ## escaped hash”和“\\#comment”

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

    更新4:进一步简化以消除可变长度负面后视(以及反向/反向技巧)