微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串中的多个捕获

如何解决字符串中的多个捕获

在 SO 上还没有找到可以完全回答这种情况的 Q/A。我已经实施了一些解决方案来达到我的目的。

我正在解析 VCF files 的标头(元数据)部分。每行的格式如下:

##TAG=<key=val,key=val,...>

我有一个正则表达式来解析 <> 中的多个 k-v 对,但我似乎无法添加 <> 并让它仍然“工作”。

s = 'a=1,b=two,c="three"'

pat = re.compile(r'''(?P<key>\w+)=(?P<value>[^,]*),?''')
match = pat.findall(s)
print(dict(match))
#{'a': '1','b': 'two','c': '"three"'}

还有,

s = 'a=1,c="three"'

pat = re.compile(r'''(?:(?P<key>\w+)=(?P<value>[^,?)''')
match = pat.findall(s)
print(match)
print(dict(match))
#[('a','1'),('b','two'),('c','"three"')]
#{'a': '1','c': '"three"'}

所以,我想我可以做到:

s = '<a=1,c="three">'

pat = re.compile(r'''<(?:(?P<key>\w+)=(?P<value>[^,?)>''')
match = pat.findall(s)
print(match)
print(dict(match))
#[]
#{}

如果可能的话,我真的很想做这样的事情:

\#\#(?P<tag>)=<(?:(?P<key>\w+)=(?P<value>[^,?)>

并捕获 TAG 和所有 k-v 对。显然,我希望它“工作”。

我意识到这里的“正确”解决方案很可能使用解析器而不是正则表达式。但我是生物信息学的人,不是程序员。并且格式非常一致,并按照(几乎)始终遵循的标准化规范进行布局。

解决方法

使用PyPi regex

import regex
s = '##TAG=<key=val,key2=val2>'
pat = regex.compile(r'''##(?P<tag>\w+)=<(?:(?P<key>\w+)=(?P<value>[^,<>]*),?)*>''')
match = pat.search(s)
print([match.group("tag"),list(zip(match.captures("key"),match.captures("value")))])

Python proof | Regex explanation

--------------------------------------------------------------------------------
  ##                       '##'
--------------------------------------------------------------------------------
  (?P<tag>                  group and capture to \k<tag>:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z,A-Z,0-9,_) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \k<tag>
--------------------------------------------------------------------------------
  =<                       '=<'
--------------------------------------------------------------------------------
  (?:                      group,but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?P<key>                        group and capture to \k<key>:
--------------------------------------------------------------------------------
      \w+                      word characters (a-z,_) (1
                               or more times (matching the most
                               amount possible))
--------------------------------------------------------------------------------
    )                        end of \k<key>
--------------------------------------------------------------------------------
    =                        '='
--------------------------------------------------------------------------------
    (?P<value>                 group and capture to \k<value>:
--------------------------------------------------------------------------------
      [^,<>]*                  any character except: ',','<','>' (0
                               or more times (matching the most
                               amount possible))
--------------------------------------------------------------------------------
    )                        end of \k<value>
--------------------------------------------------------------------------------,?                       ',' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )*                       end of grouping
--------------------------------------------------------------------------------
  >                        '>'

结果['TAG',[('key','val'),('key2','val2')]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?