编辑:

重新提出问题以便更好地理解.

对于我正在使用霍夫曼压缩的项目,我需要序列化我的霍夫曼树.

以下文字

“bought tickets to ride down a giant spiraling water slide or run

through a play maze made from brightly painted plywood. All summer

long, the sounds of laughing”

将产生一个霍夫曼树,其序列化将如下所示:

'N57|L23, |N34|N16|N8|N4|N2|L1,made|L1,long|N2|L1,bought' \

'|L1,summer|N4|N2|L1,painted|L1,from|N2|L1,|L1,sounds|N8|N4|N2|L1,play|' \

'L1,tickets|N2|L1,All|L1,down|N4|N2|L1,brightly|L1,spiraling|N2|L1,giant|' \

'L1,ride|N18|N8|N4|N2|L1,. |L1,plywood|N2|L1,laughingreplace|L1,water|N4|' \

'N2|L1,the|L1,to|N2|L1,of|L1,through|N10|N4|N2|L1,run|L1,or|L2,a|N6|N3|' \

'L1,slide|N2|L1,maze|L1,, |L3,'

注意:这是分隔树符号的正则表达式:

'(\W+)'

文本也可以是HTML并包含字符.

'|' and '\'

为了逃避他们,我改变了

'|' to '\|'

'\' to '\\'

拆分数据时,我需要忽略转义字符,只删除管道.鉴于下一个输入,这成为一个问题:

'replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );'

这是序列化输出

'N19|N8|N4|N2|L1,)|L1," );|N2|L1,script|L1,client|' \

'N4|N2|L1,2|L1,js|N2|L1,(\|L1,nojs|N11|N4|L2,s|N2|L1,replace|L1,>' \

'|N7|N3|L1,1client|N2|L1,$|L1,( /(^\|\|N4|N2|L1,\|$)/, "$|L1,|L2,-'

试图拆分它现在成了一个问题.我明白我需要删除前面有偶数斜线的管道.

['\\|', '|', '\\\\|', ...] Valid delimiters

['\|', '\\\|', ...] Invalid delimiters

当我的序列化字符串在其末尾包含斜杠时会发生这种情况.

'N54, test\\' will turn into 'N54, test\\\\|N44 ...'

到目前为止,我已经到了这个正则表达式的地步

r'(?

在它们之前捕获具有偶数斜线的管道.但是在使用时

re.split()我将永远有两个问题之一

>斜杠将与管道一起移除.

>斜杠将包含在列表中自己的单元格中.

两者都打破了我的反序列化.

我需要移除管道,而忽略斜线.

如果可能的话,我想知道如何用re.split()来做到这一点虽然我开始认为它只能用re.findall()

编辑

澄清:拆分数据不应该有空字符串.

解决方法:

我写了一个折磨测试,创造并组合了几个小字符串 – 我认为它应该照顾大多数角落案例.

马里亚诺的发现者()答案通过了这个测试的飞行颜色.但是,在我的机器上它比使用split()慢15%-20%.

但是,他有一个新的findall()解决方案,他在将字符串传递给re之前对其进行修改,这比此处显示的split()解决方案更快更简单.

请注意,最近澄清了OP在管道字符之间永远不会有任何空字符串,Mariano提出的原始findall()示例(不需要初始字符串修改)对于原始海报是最好的.

Mariano的新findall()解决方案带有预先修改过的字符串,对于一般情况来说可能是最好的. split()位居第二,但这是我关注的焦点,因为它是原始问题的焦点:-)

以下代码适用于Python 2和Python 3.

import re

import itertools

import time

def use_finditer(data):

regex = re.compile(r'((?:[^|\\]+|\\.)*)([|])?')

result = []

for m in regex.finditer(data):

result.append(m.group(1))

if (not m.group(2)):

break

return result

def use_split(data):

regex = re.compile(r'(?:\|)?((?:[^|\\]|\\.)*)')

result = regex.split(data)

start_delete = data.startswith('|') * 2 if data else 1

del result[start_delete::2]

return result

def check_split(split_func):

values = '', '', '', ' ', ' ', '|', '|', '\\', '\\\\', 'abc', 'd|ef', 'ghi\\'

values = [x.replace('\\', '\\\\').replace('|', '\\|') for x in values]

stuff = [], []

for i in range(1, 6):

srclist = list(itertools.permutations(values, i))

for src in srclist:

src = tuple(src)

dst = tuple(split_func('|'.join(src)))

stuff[dst != src].append((src, dst))

if not stuff[1]:

print("Successfully executed %d splits" % len(stuff[0]))

return

print(len(stuff[0]), len(stuff[1]))

stuff[1].sort(key=lambda x: (len(x), x))

for x, y in stuff[1][:20]:

z = '|'.join(x)

print(x, repr(z), y)

def check_loop(func, count=20):

start = time.time()

for i in range(count):

check_split(func)

print('Execution time: %0.2f' % (time.time() - start))

print('\nUsing finditer')

check_loop(use_finditer)

print('\nUsing split')

check_loop(use_split)

标签:python,regex,delimiter,serialization,escaping

来源: https://codeday.me/bug/20190727/1557512.html

python分隔符是干啥_python – 拆分转义分隔符相关推荐

  1. python分隔符是干啥_python文件路径分隔符的详细分析

    写了挺久的python,文件分隔符的掌握肯定是必须的,但是我之前写的都是不规范的文件路径分隔符,例如''C:\User\temp\python.txt',一直都没有报过错.也不知为啥,今天查阅资料才知 ...

  2. 全网惟一面向软件测试人员的Python基础教程-在Python中怎么干倒字符串?

    全网惟一面向软件测试人员的Python基础教程 起点:<python软件测试实战宝典>介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你 ...

  3. python log函数怎么打_Python的log日志功能及设置方法

    python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客

  4. python判断素数的函数_Python素数prime函数练习_Python源码实操

    Python素数prime函数练习_Python源码实操 素数prime函数练习 1) 写一个函数isprime(x) 判断x是否为素数,如果是素数,返回True,否则返回False def ispr ...

  5. python 字符串分割和拼接_python分割和拼接字符串

    关于string的split 和 join 方法 对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机制不一样,但是功能上一样. 1.string.split( ...

  6. python读取excel写入数据库_python实现读取excel写入mysql的小工具详解

    Python是数据分析的强大利器 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理. 这里向大家分享python如何读取excel,并使 ...

  7. python 将列表按指定长度拆分

    Python 将列表按指定长度拆分 代码示例: c = 3 a = [1,2,3,4,5,6,7,8,9,10,11]def cut_list(lists, cut_len):"" ...

  8. python爬虫是干嘛的?python爬虫能做什么?

    python爬虫可以用于收集数据,爬虫是一个爬虫程序,一个程序的运行速度是非常快的,而且不会因为重复的事情感到疲倦,接下来我们一起学习python爬虫是干嘛用的,python爬虫究竟能做什么呢?pyt ...

  9. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

最新文章

  1. 华为对边缘计算的思考与理解
  2. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  3. 1.Spring Cloud Alibaba教程:简介
  4. 构造、拷贝构造、赋值、析构
  5. fit,fit_generator的使用区别
  6. update inner join mysql_Mysql update inner join
  7. 强化学习常用算法+实际应用
  8. 求正整数的阶乘 c语言,求10000的阶乘(c语言代码实现)
  9. JAVA中,如果发现一个值起作用,却又没找到哪里使用,检查一下是否有native/JNI中反射
  10. 修改本机域名localhost为任意你想要的名称
  11. 学霸是怎样炼成的?学了那么多还一无是处?如何克服学习阻力?一件枯燥讨厌的事但必须要做?内心强大的主观改造 自我加速(学以致用)与环境加速(学习型组织)
  12. 一块蛋清皂,把毛孔洗得一干二净
  13. steam饥荒服务器为什么显示未响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...
  14. 知乎页面的html代码,仿知乎当复制网页内容时在尾部加入版权信息代码
  15. fir.im Weekly - 如何打造 Github 「爆款」开源项目
  16. 【hadoop权威指南第四版】第三章hadoop分布式文件系统【笔记+代码】
  17. Python中的enumerate用法
  18. 解决阿里云盘分享文件数量太多而无法分享的问题
  19. Pixhawk---sdlog2应用详解
  20. 【转载】SQL注入进阶

热门文章

  1. 谷歌三大核心技术(三)Google_BigTable中文版
  2. 高新技术企业认定的条件
  3. Modbus在Android上的应用之Modbus TCP Slave
  4. Linux服务器教程之路1--Linux服务器的相关搭建
  5. unity绘制管道_【译文】unity可编程渲染管道#1——自定义管道
  6. 跆拳道拳击馆健身运动小程序开发制作功能介绍
  7. 离线地图瓦片下载 高德地图 谷歌地图 天地图 Mapbox地图 矢量 卫星地图下载
  8. 雪花算法原理_迈向雪花的大统一理论,雪花结晶理论之父提出新思路
  9. 游戏音乐从红白机到音乐会的发展历程
  10. linux中cc命令,cc编译命令选项