V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
chaleaochexist
V2EX  ›  程序员

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

  •  
  •   chaleaochexist · 2023-09-08 16:00:34 +08:00 · 1108 次点击
    这是一个创建于 472 天前的主题,其中的信息可能已经有所发展或是发生改变。

    \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] 0jf8je.png 但是这个正则放在程序里提示匹配失败.

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

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

    6fnlk3.png

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

    第 1 条附言  ·  2023-09-08 17:43:58 +08:00
    这个解释起来有点麻烦,
    感兴趣的热心大佬可以试一下登录自己的 ssh 服务器 用 python 或者 golang
    然后将 output 输出看一下 然后抓一下\x1b 或者\033

    前提是你的$PS1 是带颜色的.
    第 2 条附言  ·  2023-09-08 19:57:37 +08:00
    谢谢大佬们 是我阅读不仔细. 尤其感谢 3 楼 和 9 楼
    leaflxh
        1
    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
        2
    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
        3
    yuankui  
       2023-09-08 16:23:33 +08:00   ❤️ 1
    ```
    >>> 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
        4
    YGHMXFAL  
       2023-09-08 16:24:36 +08:00
    (\\x1b)\[[[:digit:];]*m

    然后\1 就是\x1b

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

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

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

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


    @yuankui 大佬我觉得你说的有道理 能直接给个例子吗
    zzl22100048
        7
    zzl22100048  
       2023-09-08 18:02:17 +08:00   ❤️ 1
    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
        8
    qeqv  
       2023-09-08 18:02:44 +08:00   ❤️ 1
    最前面的反斜杠去掉
    \x1b\[[0-9;]*[mK]
    Belmode
        9
    Belmode  
       2023-09-08 18:04:02 +08:00   ❤️ 1
    编程语言入门问题...

    #3 #5 好好看看你就就明白了
    NessajCN
        10
    NessajCN  
       2023-09-08 18:40:48 +08:00 via Android
    不同语言对 unicode 字符的正则语法有区别的
    qeqv
        11
    qeqv  
       2023-09-08 18:46:38 +08:00   ❤️ 1
    字符串转义可以处理 \x1b 为对应 ASCII 字符,正则引擎也可以处理,所以不需要管这个字符。
    你应该注意的是后面的 \[ ,由于要完整输入 \[ 到正则引擎,所以如果字符串会被转义,那就得 \\[ ,如果不会被转义,就直接 \[
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3283 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:02 · PVG 20:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.