超级无敌磊果果 发表于 2022-8-19 10:54:51

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

本帖最后由 超级无敌磊果果 于 2022-9-18 10:55 编辑

需要完成日志数据提取:日志格式如下
10:50:23 123 log data

期望采用正则表达式实现,表达式如下:
(^\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.*)\\]',自动帮我增加了取消转义,但是我要的是保留转义,请问如何实现

Brick_Porter 发表于 2022-8-19 11:51:04

使用原始字符串试试,在字符串前面加上r表明该字符串内部不需要转义,按照字面意思解释字符串
s1 = r'(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[('
s2 = r'\s.*)\]'
keybyte = r'0x64'

print(s1+keycode+s2)# 输出(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]

LMC_M 发表于 2022-8-19 13:59:51

a=r'\n\n'
b='abc'
print(a+b)
\n\nabc

jackz007 发表于 2022-8-20 17:00:29

本帖最后由 jackz007 于 2022-8-20 17:08 编辑

         转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受。其实,在计算机内部,字符串中是不包含任何转义的。不信的话,你可以运行:
print(len('(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'))
         看看这个字符串的实际长度是否和你数出来的字符数相等。
         这个字符串中的字符数是 51 个,可是,其实际长度却是 43,少了 8 个,是不是有一点巧合,你知道是为什么吗?

超级无敌磊果果 发表于 2022-9-1 09:06:17

Brick_Porter 发表于 2022-8-19 11:51
使用原始字符串试试,在字符串前面加上r表明该字符串内部不需要转义,按照字面意思解释字符串

这个不行,你是使用了print所以看不到转义字符,实际是有的

超级无敌磊果果 发表于 2022-9-1 09:07:44

LMC_M 发表于 2022-8-19 13:59


print的不行 如果吧数据存在变量里面 变量还是有转义

超级无敌磊果果 发表于 2022-9-1 09:09:24

jackz007 发表于 2022-8-20 17:00
转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受 ...

不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了

jackz007 发表于 2022-9-1 09:48:21

本帖最后由 jackz007 于 2022-9-1 09:58 编辑

超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了

       所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要转义的字符都不可见,所以,必须这样表达,比如 '\n' 等等,这就决定了 '\' 必须 "吃掉" 一个后续字符,于是,才有了用 '\\' 对 '\' 的表达,这样做的目的,只不过是为了让计算机明白我们的意图而已,不必太过拘泥于字符串的表面形式。其实,根本就不存在什么 "自动添加" 的事情,字符串的内容是什么,用 print() 打印出来看看,这个绝对不会含有转义。而这个,才是 "庐山真面目"。

超级无敌磊果果 发表于 2022-9-13 22:29:47

jackz007 发表于 2022-9-1 09:48
所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要 ...

直接点吧,老哥 这个怎么解决 哈哈

jackz007 发表于 2022-9-13 23:09:50

本帖最后由 jackz007 于 2022-9-13 23:16 编辑

超级无敌磊果果 发表于 2022-9-13 22:29
直接点吧,老哥 这个怎么解决 哈哈

      请举例说明,什么是你要的 "保留转义",而什么又是你所得到的 "取消转义",而你所谓的 "可变参数" 指的又是什么,一个普通的字符串?

wp231957 发表于 2022-9-14 06:36:06

超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了

所以你应该把最原始的需求说一下,而不是你的什么方法一方法二

Twilight6 发表于 2022-9-14 07:19:25

超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了


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

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

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


超级无敌磊果果 发表于 2022-9-18 10:55:52

wp231957 发表于 2022-9-14 06:36
所以你应该把最原始的需求说一下,而不是你的什么方法一方法二

已补充,并修改问题描述,可以再看下哈

超级无敌磊果果 发表于 2022-9-18 10:56:32

Twilight6 发表于 2022-9-14 07:19
Python 中不管你拼接还是不拼接,字符串中的 \ 都会为 \\

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

不是正则不规范 我优化了问题描述,可以再看下

wp231957 发表于 2022-9-18 11:04:34

超级无敌磊果果 发表于 2022-9-18 10:55
已补充,并修改问题描述,可以再看下哈

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

而应该说你想要什么样式的结果

jackz007 发表于 2022-9-18 11:53:34

本帖最后由 jackz007 于 2022-9-18 11:58 编辑

regular_expression= '(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'
       把 '\' 写成 '\\' 只是表达方式,是为了满足与 Python "对话" 的需要,实际上,你输入Python 的 '\\' 在 Python 内部,实实在在就是 '\',它真的就是一个字符,并非两个。
       所以
'(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'
       就是
'(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]'
       你若不信,很简单,把它直接打印出来看看不就知道了?
print('(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]')
页: [1]
查看完整版本: python进行字符串拼接的时候如何保留转义