Python正则表达式剪切模式字符串

时间:2018-07-30 08:23:00

标签: python regex regex-group

我的文件中包含以下信息:

 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]

我想按正则表达式划分此信息,因为并非所有块都是单独的 用换行符('\ n'),所以我很难对正则表达式做的拆分操作:

^[\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]
    

4 个答案:

答案 0 :(得分:1)

此正则表达式会将输入文本分为以model %>% # Creates dense embedding layer; outputs 3D tensor # with shape (batch_size, sequence_length, output_dim) layer_embedding(input_dim = 500, output_dim = 30, input_length = ncol(ttrainx)) %>% #bidirectional(layer_lstm(units = 64)) %>% layer_lstm(units = 10) %>% layer_dropout(rate = 0.5) %>% layer_dense(units =2, activation = 'sigmoid') 开头的组(如果要保留空白,可以省略id)。 Explanation of this regexp here

.strip()

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

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)

答案 1 :(得分:0)

使用空白split,先行搜索id,后跟空格,可能会更容易:

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

https://ideone.com/FSgVrN

答案 2 :(得分:0)

您可以使用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'}]
>>> 

答案 3 :(得分:0)

这种方式似乎非常简单易读:

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

以换行符分隔,并以id开头。此外,您还可以将原始字符串剥去。

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