我的文件中包含以下信息:
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})$
但是它占用了我想要的结果的所有块:
第一组
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]
答案 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)
答案 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开头。此外,您还可以将原始字符串剥去。