2016-01-23 133 views
0

如何在正则表达式中做'或'。我读到我需要简单地将各种表达式放入括号中,但是当我试图在'Total:'或'Price for 1 night @'之后获得任何输出时,下面的findall不起作用。正则表达式findall逻辑或

p = re.findall(r'(Total: (.*))(Price for 1 night: (.*))',s) 

给一些更多的上下文:

prices1=[] 

soup = bs(content, 'lxml') 
s=soup.prettify() 
p = re.findall(r'(Total: (.*))|(Price for 1 night: (.*))',s) 
for x in p: 
    if '£' in x: 
     num=int(x.replace('£','')) 
     prices1.append(num) 

来源:

http://www.booking.com/searchresults.en-gb.html?label=gen173nr-17CAEoggJCAlhYSDNiBW5vcmVmaFCIAQGYAS64AQTIAQTYAQHoAQH4AQs&sid=1a43e0952558ac0ad0061d5b6523a7bc&dcid=1&checkin_monthday=23;checkin_year_month=2016-1;checkout_monthday=24;checkout_year_month=2016-1;&city=-2601889&class_interval=1&csflt=%7B%7D&dtdisc=0&group_adults=7&group_children=0&highlighted_hotels=1192837&hlrd=0&hp_sbox=1&hyb_red=0&inac=0&label_click=undef&nflt=ht_id%3D201%3B&nha_red=0&no_rooms=1&redirected_from_city=0&redirected_from_landmark=0&redirected_from_region=0&review_score_group=empty&room1=A%2CA%2CA%2CA%2CA%2CA%2CA&sb_price_type=total&score_min=0&si=ai%2Cco%2Cci%2Cre%2Cdi&ss=London&ss_all=0&ssafas=1&ssb=empty&sshis=0&ssne=London&ssne_untouched=London&order=price_for_two 

值的示例:

<strong class="price scarcity_color sr_gs_rackrate_price 
anim_rack_rate 
" title="Price for 1 night £69"> 
<b> 
<span class="sr_gs_rackrate_total">Total: </span> 
£69 
</b> 
</strong> 
<td class="totalPrice" colspan="3"> 
<div data-component="track" data-hash="OLNYSRfCbdWGffSRe" data-stage="1" data-track="view"></div> 
Total: £145 
</td> 
+0

取而代之的是链接的,你可以有给我们的价值's' –

+0

值是极长 – Nickpick

+0

那么也许只是有趣的部分? –

回答

1

首先,你应该清理你的输入,删除所有的HTML标签用替换和这个正则表达式</?[^>]*>

然后你会有类似Total: £69 Total: £145。由于您不想匹配£69 Total: £145但实际价格,您必须将.更改为[^\s](匹配除空格外的任何内容)。

然后你只需要添加一个|您的条件之间:

Total: ([^\s]*)|Price for 1 night: ([^\s]*) 

Live Demo (updated)

+0

绝对是朝着正确的方向迈进的一步,但不适用于我添加的演示文本。任何建议表示赞赏我怎么才能得到的数字 – Nickpick

+0

@Nicolas看到编辑 –

+0

真的很酷。我认为用替换工程,但有没有办法在一个地方做两个正则表达式?例如:“night(。*)| Total(。*)”然后我可以添加第二个,只需要用一个和运算符查找'£'就可以查找数字后面的数字。 – Nickpick