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.*)\\]',自动帮我增加了取消转义,但是我要的是保留转义,请问如何实现 使用原始字符串试试,在字符串前面加上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.*)\] a=r'\n\n'
b='abc'
print(a+b)
\n\nabc 本帖最后由 jackz007 于 2022-8-20 17:08 编辑
转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受。其实,在计算机内部,字符串中是不包含任何转义的。不信的话,你可以运行:
print(len('(^\\d{2}:\\d{2}:\\d{2}\\s\\d{3}).*\\[(0x64\\s.*)\\]'))
看看这个字符串的实际长度是否和你数出来的字符数相等。
这个字符串中的字符数是 51 个,可是,其实际长度却是 43,少了 8 个,是不是有一点巧合,你知道是为什么吗? Brick_Porter 发表于 2022-8-19 11:51
使用原始字符串试试,在字符串前面加上r表明该字符串内部不需要转义,按照字面意思解释字符串
这个不行,你是使用了print所以看不到转义字符,实际是有的 LMC_M 发表于 2022-8-19 13:59
print的不行 如果吧数据存在变量里面 变量还是有转义 jackz007 发表于 2022-8-20 17:00
转义只是一种表达方式,也就是说,只是用于人机交互,以便彼此交流的信息能被对方准确理解和接受 ...
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了 本帖最后由 jackz007 于 2022-9-1 09:58 编辑
超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了
所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要转义的字符都不可见,所以,必须这样表达,比如 '\n' 等等,这就决定了 '\' 必须 "吃掉" 一个后续字符,于是,才有了用 '\\' 对 '\' 的表达,这样做的目的,只不过是为了让计算机明白我们的意图而已,不必太过拘泥于字符串的表面形式。其实,根本就不存在什么 "自动添加" 的事情,字符串的内容是什么,用 print() 打印出来看看,这个绝对不会含有转义。而这个,才是 "庐山真面目"。 jackz007 发表于 2022-9-1 09:48
所谓 "自动添加" 只不过是在 IDLE 中看变量内容时才会有,其原因也是字符串内容表达,由于需要 ...
直接点吧,老哥 这个怎么解决 哈哈 本帖最后由 jackz007 于 2022-9-13 23:16 编辑
超级无敌磊果果 发表于 2022-9-13 22:29
直接点吧,老哥 这个怎么解决 哈哈
请举例说明,什么是你要的 "保留转义",而什么又是你所得到的 "取消转义",而你所谓的 "可变参数" 指的又是什么,一个普通的字符串? 超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了
所以你应该把最原始的需求说一下,而不是你的什么方法一方法二 超级无敌磊果果 发表于 2022-9-1 09:09
不知道为啥,我只知道它自动帮我增加了 \ 之后,我的正则表达式就用不了了
Python 中不管你拼接还是不拼接,字符串中的 \ 都会为 \\
正则匹配不出来和这个没关系,本身正则读取的也是 Python 转义后的,也就是 \\ 转义成了 \ 的字符
所以你匹配不出来大概率是你的正则不规范导致的
wp231957 发表于 2022-9-14 06:36
所以你应该把最原始的需求说一下,而不是你的什么方法一方法二
已补充,并修改问题描述,可以再看下哈
Twilight6 发表于 2022-9-14 07:19
Python 中不管你拼接还是不拼接,字符串中的 \ 都会为 \\
正则匹配不出来和这个没关系,本身正则 ...
不是正则不规范 我优化了问题描述,可以再看下
超级无敌磊果果 发表于 2022-9-18 10:55
已补充,并修改问题描述,可以再看下哈
你可以说 必须用正则实现,但是你不能说
期望采用正则表达式实现,表达式如下:
(^\d{2}:\d{2}:\d{2}\s\d{3}).*\[(0x64\s.*)\]
而应该说你想要什么样式的结果 本帖最后由 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]