我有一个详细的python正则表达式字符串(有很多空格和注释),我想将其转换为“普通”样式(用于导出到javascript)。特别是,我需要这个非常可靠。如果有任何明显正确的方法来做到这一点,那就是我想要的。例如,一个天真的实现会破坏像r' \# # A literal hash character'
这样的正则表达式,这是不行的。
执行此操作的最佳方法是强制python re模块给我一个非正则表示我的正则表达式,但我没有办法做到这一点。
答案 0 :(得分:4)
我相信你只需解决这两个问题就可以删除冗长的正则表达式:
尝试这个,将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))
上面是一个简化版本,它将转义的空格保留原样。结果输出将更难阅读,但应该适用于正则表达式平台。
或者,对于一个稍微复杂的答案,“unescapes”空格(即'\'=&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:进一步简化以消除可变长度负面后视(以及反向/反向技巧)