正则表达式从原始文本中提取数据
regex extract data from raw text
我在酒店工作。这是来自 rapports 的原始文件,我 have.I 需要提取数据才能得到类似 data['roomNumber']=('paxNumber',isbb,)
的内容
这是一个只涉及 2 个房间的示例,即 10 号和 12 号,所以我需要的数据应该是 BreakfastData = {'10':['2','BB'],'12':['1','BB']}
1)房间号:'start and ends with number' 或 'start with number and strictly one or more space followd by string'
2)paxNumber 是 'VA' 字符串
之前的两个数字
3)isbb 由 'BB' 或 'HPDJ' 定义,可以在两个 '/' 之间找到。但有时格式不好所以可以是'/HPDJ/'或'/HPDJ/'或'/HPDJ/'等
10 PxxxxD,David,Mme, Mr T- EXPEDIA TRAVEL
08.05.17 12.05.17 TP
SUP DBL / HPDJ / DEBIT CB AGENCE - NR
2 0 VA
NR
12
LxxxxSH,Claudia,Mrs
08.05.17 19.05.17 TP
1 0 VA
NR BB
SUP SGL / BB / EN ATTENTE DE VIREMENT- EVITER LA 66 -
.... etc
编辑:最新
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)
return
{'10': ([('2', '2'), ('1', '1')], ['HPDJ', 'BB'])}
10
12
[Finished in 0.1s]
如何在我的 return 中获取两个房间号?
我在 \n 问题和 read()、readline()、readlines() 方面遇到了很多麻烦。有什么诀窍?
当我拥有所有原始数据时,我将如何获得正确的 BreakfastData{}?我会使用 .zip() 吗?
在 bigining 时,我想拆分文件然后解析它,但我尝试了一些事情,我迷路了。为此,我需要一个匹配两种模式的正则表达式。
获取VA前文本的正则表达式如下:
r = re.compile(r"(.*) VA")
然后 "number"(将是一个字符串)将存储在搜索匹配对象的第一个 group
中,一旦您 运行 搜索。
我也不太清楚房间号是多少,因为你的描述有点不清楚,除非你说清楚,否则我帮不了你。
在第一种情况下,你想 select 两个数字后面跟着 'VA' 你可以这样做
r = re.compile(r"(\d+)\W*(\d+)\W*VA")
第二种情况你可以像这样得到HPDJ或BB
r = re.compile(r"/\s*(HPDJ|BB)\s*/")
这将处理您提到的所有情况 >> /HPDJ/' 或 '/HPDJ/' 或 '/HPDJ/'
我在酒店工作。这是来自 rapports 的原始文件,我 have.I 需要提取数据才能得到类似 data['roomNumber']=('paxNumber',isbb,)
这是一个只涉及 2 个房间的示例,即 10 号和 12 号,所以我需要的数据应该是 BreakfastData = {'10':['2','BB'],'12':['1','BB']}
1)房间号:'start and ends with number' 或 'start with number and strictly one or more space followd by string'
2)paxNumber 是 'VA' 字符串
之前的两个数字
3)isbb 由 'BB' 或 'HPDJ' 定义,可以在两个 '/' 之间找到。但有时格式不好所以可以是'/HPDJ/'或'/HPDJ/'或'/HPDJ/'等
10 PxxxxD,David,Mme, Mr T- EXPEDIA TRAVEL
08.05.17 12.05.17 TP
SUP DBL / HPDJ / DEBIT CB AGENCE - NR
2 0 VA
NR
12
LxxxxSH,Claudia,Mrs
08.05.17 19.05.17 TP
1 0 VA
NR BB
SUP SGL / BB / EN ATTENTE DE VIREMENT- EVITER LA 66 -
.... etc
编辑:最新
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)
return
{'10': ([('2', '2'), ('1', '1')], ['HPDJ', 'BB'])}
10
12
[Finished in 0.1s]
如何在我的 return 中获取两个房间号? 我在 \n 问题和 read()、readline()、readlines() 方面遇到了很多麻烦。有什么诀窍?
当我拥有所有原始数据时,我将如何获得正确的 BreakfastData{}?我会使用 .zip() 吗? 在 bigining 时,我想拆分文件然后解析它,但我尝试了一些事情,我迷路了。为此,我需要一个匹配两种模式的正则表达式。
获取VA前文本的正则表达式如下:
r = re.compile(r"(.*) VA")
然后 "number"(将是一个字符串)将存储在搜索匹配对象的第一个 group
中,一旦您 运行 搜索。
我也不太清楚房间号是多少,因为你的描述有点不清楚,除非你说清楚,否则我帮不了你。
在第一种情况下,你想 select 两个数字后面跟着 'VA' 你可以这样做
r = re.compile(r"(\d+)\W*(\d+)\W*VA")
第二种情况你可以像这样得到HPDJ或BB
r = re.compile(r"/\s*(HPDJ|BB)\s*/")
这将处理您提到的所有情况 >> /HPDJ/' 或 '/HPDJ/' 或 '/HPDJ/'