正则表达式如何匹配转义字符 \x1b

2023-09-08 16:00:34 +08:00
 chaleaochexist

\x1b 是 linux terminal 和颜色相关的一个前缀

我从 ssh 读出数据做正则匹配 抓到的数据如下:

login: Fri Sep  8 15:48:31 2023 from 127.0.0.1\r\r\n\x1b[?2004h\x1b[1;38m[v12.22.9]\x1b[0m\x1b[1;38mchaleaoch@wsl$:\x1b[

https://regex101.com/

上看是能匹配的. \\x1b\[[0-9;]*[mK] 但是这个正则放在程序里提示匹配失败.

如果改成这样 .*\[[0-9;]*[mK] 提示成功

如果改成这样 (.)\[[0-9;]*[mK] 也提示成功 且(.)对应的字符串是\x1b

我的问题是如果不用通配符, 我应该如何表达这个转义字符.

1073 次点击
所在节点    程序员
11 条回复
leaflxh
2023-09-08 16:18:08 +08:00
import re

s = "login: Fri Sep 8 15:48:31 2023 from 127.0.0.1\r\r\n\x1b[?2004h\x1b[1;38m[v12.22.9]\x1b[0m\x1b[1;38mchaleaoch@wsl$:\x1b["

r = re.compile(r"\x1b\[[0-9;]*[mK]")
#或者 r = re.compile("\\x1b\\[[0-9;]*[mK]")

print(r.findall(s))
['\x1b[1;38m', '\x1b[0m', '\x1b[1;38m']
leaflxh
2023-09-08 16:20:22 +08:00
提版本号
r = re.compile("\\x1b\\[[0-9;]*[mK](.*?)\\x1b\\[[0-9;]*[mK]")
>>> print(r.findall(s))
['[v12.22.9]']
yuankui
2023-09-08 16:23:33 +08:00
```
>>> import re
>>>
>>> # 原始字符串
>>> text = 'This is a string with \x1b some escape sequences \x1b[1;31m embedded.'
>>> pattern = re.compile(r'\\x1b')
>>>
>>> matches = pattern.findall(text)
>>>
>>> print(matches)
[]
>>>
>>> pattern = re.compile(r'\x1b')
>>> matches = pattern.findall(text)
>>> print(matches)
['\x1b', '\x1b']
```
YGHMXFAL
2023-09-08 16:24:36 +08:00
(\\x1b)\[[[:digit:];]*m

然后\1 就是\x1b

另外"放在程序里提示匹配失败",这个"程序"是啥?它本身会不会还有转义反斜杠的动作?如果是,你需要再多转义一次

regex 表达式-->你的程序-->regex 解析器,你需要保证,经过你的程序(可能存在转义动作)之后,传递给 regex 解析器的依然是你以为得那个表达式,尤其是在交互式 shell 中
yuankui
2023-09-08 16:25:46 +08:00
你应该想法搞清楚 r'\x1b' 和 u'\x1b' 的区别
chaleaochexist
2023-09-08 17:33:38 +08:00
@leaflxh
@yuankui
@YGHMXFAL

如果 像你们这么写, 我正文中就不用描述的真麻烦了 直接给出 代码示例就好了

问题就是这个 \x1b 不是纯文本.
不过还是谢谢你们的回复.


@yuankui 大佬我觉得你说的有道理 能直接给个例子吗
zzl22100048
2023-09-08 18:02:17 +08:00
import re
msg=b"login: Fri Sep 8 15:48:31 2023 from 127.0.0.1\r\r\n\x1b[?2004h\x1b[1;38m[v12.22.9]\x1b[0m\x1b[1;38mchaleaoch@wsl$:\x1b["
print_msg=msg.decode('utf-8')
print(print_msg)
for item in re.findall(rb'\x1b\[[0-9;]*[mK]', msg):
>>print(item.decode('utf-8')+'abc')


没问题啊,终端输出 bytes ,直接用 rb 匹配
qeqv
2023-09-08 18:02:44 +08:00
最前面的反斜杠去掉
\x1b\[[0-9;]*[mK]
Belmode
2023-09-08 18:04:02 +08:00
编程语言入门问题...

#3 #5 好好看看你就就明白了
NessajCN
2023-09-08 18:40:48 +08:00
不同语言对 unicode 字符的正则语法有区别的
qeqv
2023-09-08 18:46:38 +08:00
字符串转义可以处理 \x1b 为对应 ASCII 字符,正则引擎也可以处理,所以不需要管这个字符。
你应该注意的是后面的 \[ ,由于要完整输入 \[ 到正则引擎,所以如果字符串会被转义,那就得 \\[ ,如果不会被转义,就直接 \[

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972073

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX