正则表达式从原始文本中提取数据

时间:2017-05-10 01:46:07

标签: python regex extract

我在酒店工作。这里是来自我的rapports的原始文件。我需要提取数据以便有类似data['roomNumber']=('paxNumber',isbb,)

的内容

以下是仅涉及2个房间,10个和12个房间的示例,因此我需要的数据应为BreakfastData = {'10':['2','BB'],'12':['1','BB']}

1)roomNumber:'以数字开头和结尾'或'以数字开头,严格按照字符串后跟一个或多个空格'   2)paxNumber是'VA'字符串之前的两个数字   3)isbb由'BB'或'HPDJ'事件定义,可以在两个'/'之间找到。但有时格式不好,所以它可以是'/ HPDJ /'或'/ HPDJ /'或'/ HPDJ /'等

  

10 PxxxxD,David,Mme,T-EXPEDIA TRAVEL先生

     

08.05.17 12.05.17 TP

     

SUP DBL / HPDJ / DEBIT CB AGENCE - NR

     

2 0 VA

     

NR

     

12

     

LxxxxSH,克劳迪亚,杜

     

08.05.17 19.05.17 TP

     

1 0 VA

     

NR BB

     

SUP SGL / BB / EN ATTENTE DE VIREMENT-EVITER LA 66 -

     

....等

编辑:最新

import re
data = {}
pax=''
r = re.compile(r"(\d+)\W*(\d+)\W*VA")
r2 = re.compile(r"/\s*(BB|HPDJ)\s*/")
r3 = re.compile(r"\d+\n")
r4 = re.compile(r"\d+\s+\w")
PATH = "/home/ryms/regextest"

with open(PATH, 'rb') as raw:
    text=raw.read()
#roomNumber = re.search(r4, text).group()
#roomNumber2 = re.search(r3, text).group()
roomNumber = re.search(r4, text).group().split()[0]
roomNumber2 = re.search(r3, text).group().split()[0]

pax = re.findall(r, text)
adult = pax[0]; enfant = pax[1]
# if enfant is '0':
#   pax=adult
# else:
#   pax=(str(adult)+'+'+str(enfant))
bb = re.findall(r2, text)       #On recherche BB ou HPDJ
data[roomNumber]=pax,bb

print(data)
print(roomNumber)
print(roomNumber2)

返回

{'10': ([('2', '2'), ('1', '1')], ['HPDJ', 'BB'])}
10
12
[Finished in 0.1s]

我如何在归来时获得两个房间号码? 我在使用\ n问题和read(),readline(),readlines()时遇到了很多麻烦。诀窍是什么?

当我将拥有所有原始数据时,我将如何获得正确的BreakfastData {}?我会用.zip()吗? 在bigining我想分割文件,然后解析它,但我尝试这样的事情,我迷路了。为此我需要一个匹配两种模式的正则表达式。

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您要选择两个数字,后面跟着“VA”,您可以这样做

 r = re.compile(r"(\d+)\W*(\d+)\W*VA")

在第二种情况下,您可以像这样获得HPDJ或BB

r = re.compile(r"/\s*(HPDJ|BB)\s*/")

这将处理您提到的所有案例>> / HPDJ /'或'/ HPDJ /'或'/ HPDJ /'

答案 1 :(得分:0)

用于获取VA之前的文本的正则表达式如下:

r = re.compile(r"(.*) VA")

然后"数字" (一次是字符串)一旦运行搜索,将存储在搜索匹配对象的第一个group中。

我不太确定房间号是多少,因为你的描述有点不清楚,所以除非你澄清,否则我无法帮助你。