【问题标题】:Python regex cut pattern stringPython 正则表达式剪切模式字符串
【发布时间】:2018-07-30 08:22:59
【问题描述】:

我有这样的信息文件:

 id                      : 1234567890
 1)client_name           : Abcd
 2)family_name           : Efgh
 5)phon_number           : 9876543210
 6)address               : street number
 data                    : [42|63] [42|62]

 id                      : 14785236984
 1)client_name           : Abcd
 2)family_name           : Efgh
 5)phon_number           : 987555555555
 6)address               : street number
 data                    : [44|67] [21|1024]          
 id                      : 987456321
 1)client_name           : Abcd
 2)family_name           : Efgh
 5)phon_number           : 98744444444
 6)address               : street number
 data                    : [26|1089] [21|1524]

我想用正则表达式来划分这些信息,因为不是所有的块都是分开的 使用 new line('\n') 所以我很难使用 split 我尝试使用正则表达式:

^[\s]id[\w\W\s\S\t]+(\[\d{1,}\|\d{1,}\]{,2})$

但它需要我想要的所有块结果应该是:

  1. 第一组

     id                      : 1234567890
     1)client_name           : Abcd
     2)family_name           : Efgh
     5)phon_number           : 9876543210
     6)address               : street number
     data                    : [42|63] [42|62]
    
  2. 第二组

     id                      : 14785236984
     1)client_name           : Abcd
     2)family_name           : Efgh
     5)phon_number           : 987555555555
     6)address               : street number
     data                    : [44|67] [21|1024]
    
  3. 第三组

    id                      : 987456321
    1)client_name           : Abcd
    2)family_name           : Efgh
    5)phon_number           : 98744444444
    6)address               : street number
    data                    : [26|1089] [21|1524]
    

【问题讨论】:

    标签: python regex regex-group


    【解决方案1】:

    此正则表达式会将输入文本拆分为以id 开头的组(如果您想保留空格,可以省略.strip())。 Explanation of this regexp here.

    data="""
     id                      : 1234567890
     1)client_name           : Abcd
     2)family_name           : Efgh
     5)phon_number           : 9876543210
     6)address               : street number
     data                    : [42|63] [42|62]
    
     id                      : 14785236984
     1)client_name           : Abcd
     2)family_name           : Efgh
     5)phon_number           : 987555555555
     6)address               : street number
     data                    : [44|67] [21|1024]
     id                      : 987456321
     1)client_name           : Abcd
     2)family_name           : Efgh
     5)phon_number           : 98744444444
     6)address               : street number
     data                    : [26|1089] [21|1524]
    """
    
    import re
    from pprint import pprint
    
    pprint([i.strip() for i in re.findall(r'id\s*:.*?(?=id|\Z)', data, flags=re.DOTALL)], width=120)
    

    输出将是 3 个字符串的列表(我在它们之间添加了换行符以便清楚地看到它):

    ['id                      : 1234567890\n'
     ' 1)client_name           : Abcd\n'
     ' 2)family_name           : Efgh\n'
     ' 5)phon_number           : 9876543210\n'
     ' 6)address               : street number\n'
     ' data                    : [42|63] [42|62]',
    
     'id                      : 14785236984\n'
     ' 1)client_name           : Abcd\n'
     ' 2)family_name           : Efgh\n'
     ' 5)phon_number           : 987555555555\n'
     ' 6)address               : street number\n'
     ' data                    : [44|67] [21|1024]',
    
     'id                      : 987456321\n'
     ' 1)client_name           : Abcd\n'
     ' 2)family_name           : Efgh\n'
     ' 5)phon_number           : 98744444444\n'
     ' 6)address               : street number\n'
     ' data                    : [26|1089] [21|1524]']
    

    【讨论】:

      【解决方案2】:

      这种方式似乎相当简单易读:

      l = re.split(r'\n+(?=\s*id\b)', s.strip(), flags=re.M)
      print l
      

      由换行符分割,前面是 id。你也把原来的字符串去掉。

      演示:https://ideone.com/No5vva

      【讨论】:

        【解决方案3】:

        split 通过空格可能更容易,id 后跟空格:

        re.compile("\s+(?=id\s{22}:)").split(s)
        

        https://ideone.com/FSgVrN

        【讨论】:

          【解决方案4】:

          您可以使用re.split(r'\s(?=id)', s)将整个字符串拆分为多个部分,然后拆分部分中的每一行,然后根据:拆分每一行以转换为dict

          >>> s="""id                      : 1234567890
          ...  1)client_name           : Abcd
          ...  2)family_name           : Efgh
          ...  5)phon_number           : 9876543210
          ...  6)address               : street number
          ...  data                    : [42|63] [42|62]
          ... 
          ...  id                      : 14785236984
          ...  1)client_name           : Abcd
          ...  2)family_name           : Efgh
          ...  5)phon_number           : 987555555555
          ...  6)address               : street number
          ...  data                    : [44|67] [21|1024]          
          ...  id                      : 987456321
          ...  1)client_name           : Abcd
          ...  2)family_name           : Efgh
          ...  5)phon_number           : 98744444444
          ...  6)address               : street number
          ...  data                    : [26|1089] [21|1524]"""
          >>> 
          >>> import re
          >>> sections = re.split(r'\s(?=id)', s)
          >>> ld = [dict(map(str.strip, line.split(':')) for line in section.splitlines() if line) for section in sections]
          >>> 
          >>> pprint (sections)
          ['id                      : 1234567890\n'
           ' 1)client_name           : Abcd\n'
           ' 2)family_name           : Efgh\n'
           ' 5)phon_number           : 9876543210\n'
           ' 6)address               : street number\n'
           ' data                    : [42|63] [42|62]\n'
           '\n',
           'id                      : 14785236984\n'
           ' 1)client_name           : Abcd\n'
           ' 2)family_name           : Efgh\n'
           ' 5)phon_number           : 987555555555\n'
           ' 6)address               : street number\n'
           ' data                    : [44|67] [21|1024]          \n',
           'id                      : 987456321\n'
           ' 1)client_name           : Abcd\n'
           ' 2)family_name           : Efgh\n'
           ' 5)phon_number           : 98744444444\n'
           ' 6)address               : street number\n'
           ' data                    : [26|1089] [21|1524]']
          >>> 
          >>> pprint (ld)
          [{'1)client_name': 'Abcd',
            '2)family_name': 'Efgh',
            '5)phon_number': '9876543210',
            '6)address': 'street number',
            'data': '[42|63] [42|62]',
            'id': '1234567890'},
           {'1)client_name': 'Abcd',
            '2)family_name': 'Efgh',
            '5)phon_number': '987555555555',
            '6)address': 'street number',
            'data': '[44|67] [21|1024]',
            'id': '14785236984'},
           {'1)client_name': 'Abcd',
            '2)family_name': 'Efgh',
            '5)phon_number': '98744444444',
            '6)address': 'street number',
            'data': '[26|1089] [21|1524]',
            'id': '987456321'}]
          >>> 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 2016-07-08
            • 2015-11-28
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多