2016-01-23 7 views
0

Comment faire un 'ou' dans regex. J'ai lu que je devais simplement mettre les diverses expressions entre parenthèses, mais le findall suivant ne fonctionne pas quand j'essaye d'obtenir une sortie après 'Total:' ou 'Prix pour 1 nuit @'.Findel Regex avec logique ou

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

Pour donner un peu plus de contexte:

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) 

Source:

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 

valeurs Exemple:

<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

au lieu du lien que vous auriez pu nous donner la valeur de 's' –

+0

La valeur est extrêmement longue – Nickpick

+0

Alors peut-être juste la partie intéressante? –

Répondre

1

D'abord, vous devez nettoyer votre entrée, en supprimant toutes les balises HTML avec un remplacement et cette regex </?[^>]*>. Puis vous aurez quelque chose comme Total: £69 Total: £145. Comme vous ne voulez pas faire correspondre £69 Total: £145 mais les prix actuels, vous devrez changer . à [^\s] (correspondre à tout sauf les espaces).

Ensuite, vous avez juste besoin d'ajouter un | entre vos conditions:

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

Live Demo (updated)

+0

Certainement un pas dans la bonne direction, mais ne fonctionne pas avec le texte de démonstration que j'ai ajouté. Toutes les suggestions sont appréciées comment je peux juste obtenir les nombres – Nickpick

+0

@Nicolas voir modifier –

+0

Vraiment cool. Je pense avec un remplacement qui fonctionne, mais est-il possible de faire deux regex en un? Par exemple, avec "night (. *) | Total (. *)", Je pourrais alors ajouter un second simplement chercher "£" avec un opérateur et juste pour chercher le numéro après le £? – Nickpick