鱼C论坛

 找回密码
 立即注册
查看: 494|回复: 15

python进行字符串拼接的时候如何保留转义

[复制链接]
发表于 2022-8-19 10:54:51 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 超级无敌磊果果 于 2022-9-18 10:55 编辑

需要完成日志数据提取:日志格式如下
10:50:23 123 log data[0x64 0x02 0x03 0x04 0x05 0x06 0x64 0x08]

期望采用正则表达式实现,表达式如下:
(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]

在此基础上,希望把0x64作为可变参数传入,以适配更加灵活的情景,在此过程中遇到了以下问题




期望结果:regular_expression = '(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]'

问题:实际使用中0x64为可变参数 keybyte ,想着可以使用字符串拼接解决:
       
        方法一:
                keybyte  = '0x64'
                regular_expression = "".join(['(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(', keybyte , '\s.*)\]'])
        方法二:
                keybyte  = '0x64'
                regular_expression = '(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(' + keybyte + '\s.*)\]'
       
        使用上述方法得到结果为:regular_expression  = '(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]',自动帮我增加了取消转义,但是我要的是保留转义,请问如何实现

Snipaste_2022-09-18_10-55-07.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-8-19 11:51:04 | 显示全部楼层
使用原始字符串试试,在字符串前面加上r表明该字符串内部不需要转义,按照字面意思解释字符串
  1. s1 = r'(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[('
  2. s2 = r'\s.*)\]'
  3. keybyte = r'0x64'

  4. print(s1+keycode+s2)  # 输出(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-8-19 13:59:51 | 显示全部楼层
  1. a=r'\n\n'
  2. b='abc'
  3. print(a+b)
  4. \n\nabc
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-8-20 17:00:29 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-20 17:08 编辑

         转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受。其实,在计算机内部,字符串中是不包含任何转义的。不信的话,你可以运行:
  1. print(len('(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'))
复制代码

         看看这个字符串的实际长度是否和你数出来的字符数相等。
         这个字符串中的字符数是 51 个,可是,其实际长度却是 43,少了 8 个,是不是有一点巧合,你知道是为什么吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-1 09:06:17 | 显示全部楼层
Brick_Porter 发表于 2022-8-19 11:51
使用原始字符串试试,在字符串前面加上r表明该字符串内部不需要转义,按照字面意思解释字符串

这个不行,你是使用了print所以看不到转义字符,实际是有的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-1 09:07:44 | 显示全部楼层

print的不行 如果吧数据存在变量里面 变量还是有转义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-1 09:09:24 | 显示全部楼层
jackz007 发表于 2022-8-20 17:00
转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受 ...


不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-1 09:48:21 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-1 09:58 编辑
超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了


       所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要转义的字符都不可见,所以,必须这样表达,比如 '\n' 等等,这就决定了 '\' 必须 "吃掉" 一个后续字符,于是,才有了用 '\\' 对 '\' 的表达,这样做的目的,只不过是为了让计算机明白我们的意图而已,不必太过拘泥于字符串的表面形式。其实,根本就不存在什么 "自动添加" 的事情,字符串的内容是什么,用 print() 打印出来看看,这个绝对不会含有转义。而这个,才是 "庐山真面目"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-13 22:29:47 | 显示全部楼层
jackz007 发表于 2022-9-1 09:48
所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要 ...

直接点吧,老哥 这个怎么解决 哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-13 23:09:50 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-13 23:16 编辑
超级无敌磊果果 发表于 2022-9-13 22:29
直接点吧,老哥 这个怎么解决 哈哈


        请举例说明,什么是你要的 "保留转义",而什么又是你所得到的 "取消转义",而你所谓的 "可变参数" 指的又是什么,一个普通的字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-14 06:36:06 From FishC Mobile | 显示全部楼层
超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了

所以你应该把最原始的需求说一下,而不是你的什么方法一方法二
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-14 07:19:25 | 显示全部楼层
超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了



Python 中不管你拼接还是不拼接,字符串中的 \ 都会为 \\

正则匹配不出来和这个没关系,本身正则读取的也是 Python 转义后的,也就是 \\ 转义成了 \ 的字符

所以你匹配不出来大概率是你的正则不规范导致的


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-18 10:55:52 | 显示全部楼层
wp231957 发表于 2022-9-14 06:36
所以你应该把最原始的需求说一下,而不是你的什么方法一方法二

已补充,并修改问题描述,可以再看下哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-9-18 10:56:32 | 显示全部楼层
Twilight6 发表于 2022-9-14 07:19
Python 中不管你拼接还是不拼接,字符串中的 \ 都会为 \\

正则匹配不出来和这个没关系,本身正则 ...

不是正则不规范 我优化了问题描述,可以再看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-18 11:04:34 | 显示全部楼层
超级无敌磊果果 发表于 2022-9-18 10:55
已补充,并修改问题描述,可以再看下哈

你可以说 必须用正则实现,但是你不能说
期望采用正则表达式实现,表达式如下:
(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]


而应该说  你想要什么样式的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-9-18 11:53:34 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-18 11:58 编辑
  1. regular_expression  = '(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'
复制代码

       把 '\' 写成 '\\' 只是表达方式,是为了满足与 Python "对话" 的需要,实际上,你输入Python 的 '\\' 在 Python 内部,实实在在就是 '\',它真的就是一个字符,并非两个。
       所以
  1. '(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'
复制代码

       就是
  1. '(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]'
复制代码

       你若不信,很简单,把它直接打印出来看看不就知道了?
  1. print('(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2022-10-3 07:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表