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

2024-05-28 23:42:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的文件:

 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]

我想用regex来划分这些信息,因为并不是所有的块都是分开的 使用新行('\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]
    

Tags: 模块文件nameclient信息idstreetnumber
3条回答

这个正则表达式将把输入文本分成以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]']

用空格来split可能会更容易,用id的lookahead后跟空格:

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

https://ideone.com/FSgVrN

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

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

按id前面的换行符拆分。也可以提取原始字符串并将其剥离。你知道吗

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

相关问题 更多 >

    热门问题