xyh2695368537 发表于 2022-12-13 20:37:01

关于正则问题





import re
txt ='|570000C19302|C193|NCG|JGG|NCG|JGG|13:27|16:46|03:19|Y|f6vFuIpoXA%2FEL6QWCyftUyPH6nCMG2075BNBllqDF7JmjZjN|20221217|3|G1|01|03|1|0|||||||2||有||无||||J0O0W0|JOO|0|0||J009900021O005600000O005603002|0|||||1|0#1#0#0#z||'
txt = re.findall(r'|(.*?)|',txt)
print(txt)


想要提取一段字符串中两根| 之间的字符,为啥我这样写提取出来的列表还有空元素??其他元素也是一个一个的字符??下面截图了列表的一部分

gywjj 发表于 2022-12-13 21:29:55

因为|这个符号在正则里是表示或者的意思,所以不能用这个来分。你只能把|个符号进行一个转换。比如替换为#,同时,还必须是两个#号才好处理。不然只有一个的话,每两个就取得了一个,因为第一个正则把后面的符号占用了。对于你这个种要求,为什么要用正则呢,直接用split函数不是更快吗

cflying 发表于 2022-12-13 21:57:58

本帖最后由 cflying 于 2022-12-13 22:41 编辑

txt = re.findall(r'\|(.*?)(?=\|)',txt)
是这个意思么
或者这个也行,第二个\|不要\也可以,但是就是有空
txt = re.findall(r'/|([^|]+)\|',txt)
甚至这样也行
txt = re.findall(r'[^|]+',txt)
^|替换成一样

isdkz 发表于 2022-12-13 22:02:21

楼上说的有道理,虽然 | 可以用 \ 转义取消或的功能,但是只有一个 | 的话前面匹配了,后面就不会再匹配,

就拿前面的 |570000C19302|C193|NCG| 来说,r'\|(.*?)\|' 匹配到了 |570000C19302|,C193 前面的 | 被用了,

C193 前面就没有 | 了,下一个会匹配 |NCG|,也就是会隔一个才能匹配,你无法获取到所有 | 之前的字符串,

所以你得先把一个 | 换成两个 |,所以为什么要把简单的问题搞复杂呢,还不如用字符串的 split 方法

xyh2695368537 发表于 2022-12-13 22:08:32

gywjj 发表于 2022-12-13 21:29
因为|这个符号在正则里是表示或者的意思,所以不能用这个来分。你只能把|个符号进行一个转换。比如替换为#, ...

感谢!!!这段时间用正则处理字符串用多了,第一时间想到的也是正则{:10_266:}

cflying 发表于 2022-12-13 22:20:25

本帖最后由 cflying 于 2022-12-13 22:43 编辑

正则最好先看数据结构,不同的数据结构选用不同的实现方式,多看看手册说明,比如正向、反向等平时用不到,但是遇到一些奇怪的数据的时候就可能会用上
转义后|可以用,至于隔一个的问题,完全可以通过正向匹配方法来解决
页: [1]
查看完整版本: 关于正则问题