开发者社区> 问答> 正文

如何在跨多行的文本中查找模式?

我想查找在集合中分组的索引数组元素(用逗号分隔),并且搜索应产生类似这样的结果(请参见下面的文件数据示例)-

[    'foo[0]',     'foo[1]',     'foo[2]', ...,     'foo[10]']
['foobar0[0]', 'foobar0[1]', 'foobar0[2]'  ..., 'foobar0[98]']
[    'bas[0]',     'bas[1]',     'bas[2]'  ...,     'bas[99]']

我有一个文本文件,其中这些文件显示为跨多行的“集合”,并且集合按{..}分组(如下所示)-

{foo[0], foo[1], foo[2], foo[3]...\n
foo[10]}, {fooba0[0], foobar0[1], foobar0[2],....\n
foobar0[98], foobar0[99]}, {bas[0], bas[1], bas[2]...\n
bas[99]}

我用来搜索数组元素的一般表达式是-

re.findall('[a-z][A-Z]+[0-9]+\[[0-9]+\]', <list item>)

在yacc中,这将转换为-

array_element_token:     [a-z][A-Z]+[0-9]+\[[0-9]+\]
array_items_continued:   array_items_continued             |
                         array_element_token ',' 
arrays_items:            '{' array_items_continued array_element_token '},'

构建我不确定如何使用python正则表达式创建递归规则。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 22:42:14 448 0
1 条回答
写回答
取消 提交回答
  • 您可以使用

    import re
    
    s = r"""{foo[0], foo[1], foo[2], foo[3]...\n
    foo[10]}, {fooba0[0], foobar0[1], foobar0[2],....\n
    foobar0[98], foobar0[99]}, {bas[0], bas[1], bas[2]...\n
    bas[99]}"""
    results = []
    matches = re.findall(r'{[^{}]\*', s)
    for m in matches:
        results.append( re.findall(r'\w+\[\d+]', m) )
    

    参见Python演示,结果为[[[foo [0]],'foo [1]','foo [2]','foo [3]','foo [10]'],['fooba0 [ 0]','foobar0 [1]','foobar0 [2]','foobar0 [98]','foobar0 [99]'],['bas [0]','bas [1]','bas [2]','bas [99]']]`。

    {{^ {}] *regex提取{}之间的所有子字符串,然后\ \ w + [\ d +]提取与以下序列匹配的所有子字符串:

    • ` \w+ ` - 1+ letters, digits, ` _ ` chars
    • ` [ ` - a ` [ ` char
    • ` \d+ ` - 1+ digits
    • ` ] ` - a ` ] ` char.

    回答来源:stackoverflow

    2020-03-24 22:42:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《开放搜索查询分析服务架构分享》 立即下载
《用管控策略设定多账号组织全局访问边界》 立即下载
动态、高效,蚂蚁动态卡片的内核逻辑 立即下载