V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaleaochexist
V2EX  ›  程序员

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

  •  
  •   chaleaochexist · 232 天前 · 888 次点击
    这是一个创建于 232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    \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 条附言  ·  232 天前
    这个解释起来有点麻烦,
    感兴趣的热心大佬可以试一下登录自己的 ssh 服务器 用 python 或者 golang
    然后将 output 输出看一下 然后抓一下\x1b 或者\033

    前提是你的$PS1 是带颜色的.
    第 2 条附言  ·  232 天前
    谢谢大佬们 是我阅读不仔细. 尤其感谢 3 楼 和 9 楼
    leaflxh
        1
    leaflxh  
       232 天前
    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  
       232 天前
    提版本号
    r = re.compile("\\x1b\\[[0-9;]*[mK](.*?)\\x1b\\[[0-9;]*[mK]")
    >>> print(r.findall(s))
    ['[v12.22.9]']
    yuankui
        3
    yuankui  
       232 天前   ❤️ 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  
       232 天前
    (\\x1b)\[[[:digit:];]*m

    然后\1 就是\x1b

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

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

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

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


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

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