我有一个详细的python正则表达式字符串(有很多空格和注释),我想转换为"正常"样式(导出到javascript).特别是,我需要这个非常可靠.如果有任何明显正确的方法来做到这一点,那就是我想要的.例如,一个天真的实现会破坏正则表达式r' \# # A literal hash character',这是不行的.
这样做的最好方法是强制python re模块给我一个非正规表示我的正则表达式,但我没有看到这样做的方法.
我相信您只需解决以下两个问题即可删除冗长的正则表达式:
尝试一下,用单独的正则表达式替换链接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:进一步简化以消除变长的负向后看(和反向/反向技巧)
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |