【问题标题】:How to extract string between space and symbol '>'?如何在空格和符号'>'之间提取字符串?
【发布时间】:2021-09-13 03:52:19
【问题描述】:

字符串 1:

 [impro:0,grp:00,time:0xac,magic:0x00ac] CAR<7:5>|BIKE<4:0>,orig:0x8c,new:0x97

字符串 2:

[impro:0,grp:00,time:0xbc,magic:0x00bc] CAKE<4:0>,orig:0x0d,new:0x17

在字符串1中,我要提取CAR&lt;7:5BIKE&lt;4:0

在字符串2中,我要提取CAKE&lt;4:0

在 Python 中有任何正则表达式吗?

【问题讨论】:

    标签: python regex string delimiter


    【解决方案1】:

    你可以使用\w+&lt;[^&gt;]+

    DEMO

    • \w 匹配任何单词字符(相当于 [a-zA-Z0-9_])
    • + 匹配前一个令牌一次到无限次,尽可能多次,根据需要回馈(贪婪)。
    • 匹配字符
    • [^>] 匹配列表中不存在的单个字符
    • + 匹配前一个令牌一次到无限次,尽可能多次,根据需要回馈(贪婪)

    【讨论】:

      【解决方案2】:

      我们可以在这里使用re.findall(\w+.*?)&gt; 模式:

      inp = ["[impro:0,grp:00,time:0xac,magic:0x00ac] CAR<7:5>|BIKE<4:0>,orig:0x8c,new:0x97", "[impro:0,grp:00,time:0xbc,magic:0x00bc] CAKE<4:0>,orig:0x0d,new:0x17"]
      for i in inp:
          matches = re.findall(r'(\w+<.*?)>', i)
          print(matches)
      

      打印出来:

      ['CAR<7:5', 'BIKE<4:0']
      ['CAKE<4:0']
      

      【讨论】:

        【解决方案3】:

        在第一个示例中,BIKE 部分没有前导空格,而是一个管道字符。

        更精确的匹配可能是向左断言空格或管道,匹配以冒号分隔的数字并将 > 断言在右侧。

        (?<=[ |])[A-Z]+<\d+:\d+(?=>)
        

        部分模式匹配:

        • (?&lt;=[ |]) 正向向后看,直接在左侧断言空格或管道
        • [A-Z]+ 匹配 1+ 个字符 A-Z
        • &lt;\d+:\d+ 匹配 &lt; 和 1+ 数字 betqeen :
        • (?=&gt;) 正向前瞻,直接向右断言&gt;

        Regex demo

        或捕获组变体:

        (?:[ |])([A-Z]+<\d+:\d)>
        

        Regex demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-27
          • 2019-10-13
          • 1970-01-01
          • 1970-01-01
          • 2021-09-19
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          相关资源
          最近更新 更多