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

查看 108|回复 7
作者: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

我的问题是如果不用通配符, 我应该如何表达这个转义字符.
这个解释起来有点麻烦,
感兴趣的热心大佬可以试一下登录自己的 ssh 服务器 用 python 或者 golang
然后将 output 输出看一下 然后抓一下\x1b 或者\033
前提是你的$PS1 是带颜色的.

x1b, 字符, 改成, 提示

leaflxh   
这个解释起来有点麻烦,
感兴趣的热心大佬可以试一下登录自己的 ssh 服务器 用 python 或者 golang
然后将 output 输出看一下 然后抓一下\x1b 或者\033
前提是你的$PS1 是带颜色的.
leaflxh   
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']
yuankui   
提版本号
r = re.compile("\\x1b\\[[0-9;]*[mK](.*?)\\x1b\\[[0-9;]*[mK]")
>>> print(r.findall(s))
['[v12.22.9]']
YGHMXFAL   
```
>>> 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']
```
yuankui   
(\\x1b)\[[[:digit:];]*m
然后\1 就是\x1b
另外"放在程序里提示匹配失败",这个"程序"是啥?它本身会不会还有转义反斜杠的动作?如果是,你需要再多转义一次
regex 表达式-->你的程序-->regex 解析器,你需要保证,经过你的程序(可能存在转义动作)之后,传递给 regex 解析器的依然是你以为得那个表达式,尤其是在交互式 shell 中
chaleaochexist
OP
  
你应该想法搞清楚 r'\x1b' 和 u'\x1b' 的区别
yuankui   
@leaflxh
@yuankui
@YGHMXFAL
如果 像你们这么写, 我正文中就不用描述的真麻烦了 直接给出 代码示例就好了
问题就是这个 \x1b 不是纯文本.
不过还是谢谢你们的回复.
@yuankui 大佬我觉得你说的有道理 能直接给个例子吗
您需要登录后才可以回帖 登录 | 立即注册

返回顶部