Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 01:57

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Python Regular expression

Discussion on Python Regular expression within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
FreewayC's Avatar
 
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
Python Regular expression

Hi,

ich möchte gerne einen Wert zwischen zwei HTML Elementen über "Regular expression" auslesen. Kämpf mich schon seit mehreren Stunden durch die Dokumentation, aber ich bekomme es einfach nicht gebacken.

Das ganze sieht so aus:

<br>MeinWert 1,00 Euro </br>


Wobei sich der Inhalt auch mal ändern kann (bsp: Eurowert fällt weg)

Zwischen den br Elementen sind ein Haufen Leerzeichen. Hab es schon mit BeautifulSoup probiert, aber der HTML Content ist einfach so extrem schlecht aufgebaut, sodass es nicht funktioniert hat.


freundliche Grüße
freewayc
FreewayC is offline  
Old 11/01/2015, 19:02   #2
 
elite*gold: 0
Join Date: Jul 2009
Posts: 211
Received Thanks: 137
HTML gehört zu den kontextfreien Sprachen. Reguläre Ausdrücke lassen sich aber nur sinnvoll auf die regulären Sprachen anwenden und somit nicht für HTML benutzen.
Mit dem HTML-Parser (in deinem Fall BeautifulSoup) kannst du dir den Parse-Tree erstellen und mit dem relativ leicht umgehen.

Du könntest alle Inhalte durchiterieren und den jeweiligen Inhalt mit regulären Ausdrücken überprüfen. Die leerzeichen zwischen den <br> und </br> interessieren dich dann nicht mehr.

Ich hab noch nie viel mit regulären Ausdrücken gearbeitet aber der hier sollte ein paar Fälle abdecken.
Code:
MeinWert(:)? (-)?\d(,|.)\d\d( )?(Euro)?
Damit kannst du unteranderem folgende Werte finden
Quote:
MeinWert 1,00 Euro
MeinWert 1.11 Euro
MeinWert: 1.00 Euro
MeinWert -1,00
MeinWert: 1.00
MeinWert: 1,00
...
Mysthik is offline  
Old 11/01/2015, 19:17   #3
 
FreewayC's Avatar
 
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
Danke für deine schnelle Antwort, aber "MeinWert" war nur als Beispiel gedacht. Schlussendlich steht zwischen dem <br> irgendein random Wert
FreewayC is offline  
Old 11/01/2015, 19:31   #4
 
elite*gold: 0
Join Date: Jul 2009
Posts: 211
Received Thanks: 137
Kannst du mal einen Auszug der besagten stellen aus dem HTML-Dokument geben?
Mysthik is offline  
Old 11/01/2015, 19:39   #5
 
FreewayC's Avatar
 
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
Quote:
<strong>MeinDatum 01.11.2015<br><br>Putin € 5,00<br><br>Dies ist ein Satz<br><br>Ein sehr kurzer Satz<br><br>Richtig scheiße formatiert 1337 €<br><br>NeuerWert (ohne Preis)<br><br>Blabla blabla 5,00 €<br><br>
HTML5 forever<br><br>http://elitepvpers.com<br><br>asdasdasd<br><br>Dies ist ein extra langer Satz mit allen Zeichen die mir gerade einfallen ~'#æ<br><br>Ich glaube das geht gar nicht<br><br>Endlich fertig 5,00 €







</strong>

Hab mal ein paar Phantasie Werte eingefügt, aber so sieht es aus

Edit: Jeder Wert zwischen den br's soll ausgelesen werden, und der letzte zwischen <br> und <strong> auch
FreewayC is offline  
Old 11/01/2015, 19:57   #6
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
Also ich würde den Strong Tag etrahieren, dann nach <br> Splitten, zeilen trimmen, leere Zeilen entfernen und dann Zeile für Zeile parsen
warfley is offline  
Old 11/01/2015, 21:08   #7
 
FreewayC's Avatar
 
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
Quote:
Originally Posted by warfley View Post
Also ich würde den Strong Tag etrahieren, dann nach <br> Splitten, zeilen trimmen, leere Zeilen entfernen und dann Zeile für Zeile parsen

Wie es ablaufen muss kann ich mir auch vorstellen, aber es scheitert an der Umsetzung
FreewayC is offline  
Old 11/01/2015, 21:43   #8
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
Für den Strong tag könntest du das Pattern:
Code:
<strong>(.*?)<\/strong>
verwenden. Bei den br tags dann entsprechend.
warfley is offline  
Old 11/01/2015, 23:17   #9
 
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
Wieso nicht irgendwie so:
Quote:
(^<strong>|<br>)\s*(.+?)\s*(<\/strong>$|<br>)
algernong is offline  
Old 11/02/2015, 11:25   #10
 
MrDami123's Avatar
 
elite*gold: 56
Join Date: Oct 2010
Posts: 3,409
Received Thanks: 1,219
Quote:
Originally Posted by FreewayC View Post
Wie es ablaufen muss kann ich mir auch vorstellen, aber es scheitert an der Umsetzung
Die genaue Umsetzung ist stark von deinem HTML anhängig. Du könntest den Inhalt jedes <br> tags oder was auch immer das da oben sein soll, nach spezifischen Werten überprüfen.
Z.B. nach Währungszeichen, Zahlenwerten oder beidem.

Weiß nicht was genau du extrahieren möchtest, gehe davon aus den Zahlenwert mit dem Währeungszeichen?
Wenn dein HTML eine mindest Struktur hat wie Zahlenwerte nur vorhanden wenn ein € Zeichen da ist oder das € immer hinter den Zahlenwert oder der Zahlenwert da es sich um Währeung handelt immer nur zwei Nachkommastellen hat etc. muss man den Code mit mehr oder weniger Überprüfungen schreiben.

Hier ein Beispiel:
Code:
def check_for_integer(zeilen):
    """ Sucht nach Integer in Zeile. Gibt Liste aus Tuple von Zahl und Zeile zurück. """
    funde = []
    for zeile in zeilen:
        for wort in [w.replace(',', '') for w in zeile.split(' ')]:
            try:
                wert = int(wort)
                funde.append((wert, zeile))
            except:
                pass
    return funde

def check_for_string(zeilen, werte):
    """ Checkt ob Wörter in Zeilen Werte enthalten. Ignoriert Groß-Kleinschreibung. """
    funde = []
    for zeile in zeilen:
        if [wort for wort in zeile.split(' ') if any(wert in wort.lower() for wert in werte)]:
            funde.append(zeile)
    return funde


text = u"""<strong>MeinDatum 01.11.2015<br><br>Putin € 5,00<br><br>Dies ist ein Satz<br><br>Ein sehr kurzer Satz<br><br>Richtig scheiße formatiert 1337 €<br><br>NeuerWert (ohne Preis)<br><br>Blabla blabla 5,00 €<br><br>
HTML5 forever<br><br>http://elitepvpers.com eUro<br><br>asdasdasd<br><br>Diestz mit allen Zeichen die mir gerade einfallen ~'#æ<br><br>Ich glaube das geht gar nicht<br><br>Endlich fertig 5,00 €

</strong>"""

# teilt text in zeilen zwischen br tags
zeilen = [zeile for zeile in text.split('<br>')]

werte = (u'€', u'euro', u'dollar', u'$')

wert_funde = check_for_string(zeilen, werte)
print(wert_funde)

int_funde = check_for_integer(zeilen)
print(int_funde)

int_und_wert_funde = check_for_integer(wert_funde)
print(int_und_wert_funde)
MrDami123 is offline  
Old 11/23/2015, 18:09   #11
 
Moonsteroid's Avatar
 
elite*gold: 21
Join Date: Feb 2012
Posts: 943
Received Thanks: 709
Also ich kann dir nur davon abraten mit re aus HTML Tags auszulesen!
Wie bereits erwähnt wurde solltest du dafür BeautifulSoup benutzen(ich kann mir schlecht vorstellen das es nicht geht..)!

Hier ein kleines Beispiel um dein o.g. beispiel auszulesen:

Code:
import bs4

# Dein HTML TAG 
string = "<br>MeinWert 1,00 Euro </br>"

# Parsen
soup = bs4.BeautifulSoup(string, "html.parser")

# TAG inhalt ausgeben
print soup.text
#>> MeinWert 1,00 Euro
Moonsteroid is offline  
Old 11/23/2015, 20:29   #12
 
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
Quote:
Also ich kann dir nur davon abraten mit re aus HTML Tags auszulesen!
Wieso rätst du davon ab?
algernong is offline  
Old 11/23/2015, 21:31   #13
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by algernong View Post
Wieso rätst du davon ab?
Es ist hässlich, unübersichtlich, schwerer zu verstehen/warten, und bei evtl. kleinen Fehlern in HTML (die durchaus auftreten können) nicht mehr wirklich anwendbar.

Hier noch eine detailierte Beschreibung:
.SkyneT. is offline  
Thanks
1 User
Old 11/23/2015, 22:18   #14
 
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
Quote:
Es ist hässlich, unübersichtlich, schwerer zu verstehen/warten, und bei evtl. kleinen Fehlern in HTML (die durchaus auftreten können) nicht mehr wirklich anwendbar.
Wir reden aber über sehr wenige Zeilen an Code. Ich finde nicht, dass da das eine besser oder schlechter zu warten ist als das andere.
Bei kleinen Fehlern im HTML kann der Code auch mit einem HTML Parser schief gehen. Man muss festlegen, welche Fehler auftreten könnten - und die kann man dann auch im Regexp berücksichtigen.
Quote:
Hier noch eine detailierte Beschreibung: html - RegEx match open tags except XHTML self-contained tags - Stack Overflow
Das bezieht sich aber auf HTML allgemein. Der Aufbau in Post #5 ist regulär.
algernong is offline  
Old 11/23/2015, 22:50   #15
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by algernong View Post
Wir reden aber über sehr wenige Zeilen an Code. Ich finde nicht, dass da das eine besser oder schlechter zu warten ist als das andere.
Wenn du das hier:
Code:
(^<strong>|<br>)\s*(.+?)\s*(<\/strong>$|<br>)
als wartungsfreundlich bezeichnest, dann kennst du wohl einfach die Bedeutung dieses Wortes nicht.

Quote:
Originally Posted by algernong View Post
Bei kleinen Fehlern im HTML kann der Code auch mit einem HTML Parser schief gehen. Man muss festlegen, welche Fehler auftreten könnten - und die kann man dann auch im Regexp berücksichtigen.
Also ich muss hier nichts festlegen, bs4 kommt damit "einfach so" zurecht:
Code:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<htm@)($*><body><table <tr><td>hi</tr></td></body><html")
>>> print soup.prettify()
<htm>
 <body>
  <table>
   <tr>
    <td>
     hi
    </td>
   </tr>
  </table>
 </body>
</htm>
.SkyneT. is offline  
Reply


Similar Threads Similar Threads
expression must have integral or enum type
03/16/2014 - C/C++ - 5 Replies
void info(SOCKET *accetta, std::string id, int client) { std::string info = EncryptGamePacket("req_info" + "1" + id); for (int i = 0; i <= utenti; i++) send(accetta, info.c_str(), info.size(),0); } Someone know why i get error : expression must have integral or enum type ?
[QUEST] Regular Expression
10/17/2013 - Metin2 Private Server - 2 Replies
Hi guys, I want do this regex strings. Function name is string.match() from Lua. I want use to my quest. How do we do? Thank you.. Good works.. Edit:
[RegEx] Regular Expression Problem
02/23/2013 - General Coding - 5 Replies
ERLEDIGT! Aloha zusammen, habe ein kleines Problem mit RegEx. Habe mich bisher leider wenig damit beschäftigt.. Nun weiß ich auch warum... vll kann mir einer von euch helfen... Hier mal zum Aufbau: Quelauszug der durchsucht werden muss:
09.02.2011 Online With Crack 2.76 ibot expression
02/28/2011 - DarkOrbit - 15 Replies
Friends bakıyorumki everyone was for the licensed user to the bot problem in attracting more than I have searched all over but the demand could not look at and with ibot karşınızdayım photoshop 2.76 crack for expression will be the thank you can get there by looking at the button tıklarsanızda sevinirim ... l1.link must download:http://www.freecap.ru/files/freecap_setup _eng.exe NEW IKB.EXE:Multiupload.com - upload your files to multiple file hosting sites! İBot 2.76 mutlaka...
Microsoft Expression Web 4
01/07/2011 - General Art - 4 Replies
Guten Tag, Also ich habe ein Problem mit der oben genannten Software. Heute ist endlich das Paket eingetroffen, und ich habe es wunderbar installiert. Nur leider funktioniert 1 Programm nicht. Microsoft Expression Web 4 Beim öffnen kommt eine Fehlermeldung, danach sucht es nach einer Lösung. Im Anhang befindet sich das Bild zum genannten Problem.



All times are GMT +2. The time now is 01:57.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.