Wie man die Breite und Höhe x2 mit Python Regular machen

Ich muss viele Arbeit machen, um so zu ändern:

<img src = "/" height="111" width="10" /> 

nach

  • "Kann Python nicht ausführbar finden ..." - npm install hängt
  • Kann die neueste Version in Esky nicht deinstallieren
  • Python 2.7 auf Ubuntu
  • Kann ich einen Hinweis auf eine Python-Eigenschaft bekommen?
  • Pandas verschmelzen auf aggregierten Spalten
  • Was ist der richtige Weg, um ZODB Blobs zu sichern?
  •  <img src = "/" height="222" width="20" /> 

    So möchte ich python verwenden Regular das ist mein Code:

     import re s = '<img src = "werwerwe" height="111" width="10" />' def a(x): print x.group(2) print x.group(4) ss = re.sub(r'''<img.*(width\s*="?(\d+)"?)*\s*(height\s*="?(\d+)"?)*''',a, s) print ss 

    Was kann ich also tun ,

    Vielen Dank

    aktualisiert:

    es ist gut jetzt :

     import re s = '<img src = "/" height="111" width="10" />' def a(x): b = x.group(0) b = b.replace(x.group(1),str(int(x.group(1))*2)) b = b.replace(x.group(2),str(int(x.group(2))*2)) return b ss = re.sub(r'''<img.*?height=\"(\d+)\".*?width=\"(\d+)\"[^>]*>''',a, s) print ss 

  • SQLite3 und Multiprocessing
  • Regular Expression, um Cross-Plattform-Newline-Zeichen zu entsprechen
  • Wie benutzt man twitter search API asynchron in python?
  • Python: Selen-chromedriver Fehler auf neuem Browser-Objekt
  • Wie kann ich einen Python-Code neu formatieren, um richtig formatiert zu werden?
  • Python pandas dataframe sort_values ​​funktioniert nicht
  • 6 Solutions collect form web for “Wie man die Breite und Höhe x2 mit Python Regular machen”

    Verwenden Sie keine regulären Ausdrücke, um HTML zu analysieren. Verwenden Sie BeautifulSoup

     >>> from BeautifulSoup import BeautifulSoup >>> ht = '<html><head><title>foo</title></head><body><p>whatever: <img src="foo/img.png" height="111" width="22" /></p><ul><li><img src="foo/img2.png" height="32" width="44" /></li></ul></body></html>' >>> soup = BeautifulSoup(ht) >>> soup <html><head><title>foo</title></head><body><p>whatever: <img src="foo/img.png" height="111" width="22" /></p><ul><li><img src="foo/img2.png" height="32" width="44" /></li></ul></body></html> >>> soup.findAll('img') [<img src="foo/img.png" height="111" width="22" />, <img src="foo/img2.png" height="32" width="44" />] >>> for img in soup.findAll('img'): ... ht = int(img['height']) ... wi = int(img['width']) ... img['height'] = str(ht * 2) ... img['width'] = str(wi * 2) ... ... >>> print soup.prettify() <html> <head> <title> foo </title> </head> <body> <p> whatever: <img src="foo/img.png" height="222" width="44" /> </p> <ul> <li> <img src="foo/img2.png" height="64" width="88" /> </li> </ul> </body> </html> >>> 

    Verwenden Sie keine regulären Ausdrücke beim Umgang mit HTML . Parse es richtig mit so etwas wie lxml .

     import lxml.html html = '<img src = "werwerwe" height="111" width="10" />' etree = lxml.html.fromstring(html) images = etree.xpath('//img') for image in images: h = int(image.attrib['height']) w = int(image.attrib['width']) image.attrib['height'] = str(h*2) image.attrib['width'] = str(w*2) print lxml.html.tostring(etree) 

    Gibt:

    <img src="werwerwe" height="222" width="20">

    Haftungsausschluss: Ich bin damit einverstanden, dass das Analysieren von HTML am besten mit einem HTML-Parser durchgeführt wird. Allerdings hat das Plakat speziell für eine Regex-Lösung gefragt, und dieses besondere Problem stellt ein gutes Fahrzeug dar, um eine kluge (und wenig bekannte) Regex-Technik zu zeigen, die ziemlich praktisch ist.

    Aber zuerst gibt es einen logischen Fehler in der ursprünglichen Funktion. Es führt blind seinen numerischen Ersatz durch, was zu fehlerhaften Ergebnissen führt, wenn die WIDTH genau die Hälfte der HÖHE ist, z. B. Angesichts der folgenden:

     <img src = "/" width="10" height="20" /> 

    Das ursprüngliche gebuchte Programm gibt das folgende fehlerhafte Ergebnis zurück:

     <img src = "/" width="40" height="40" /> 

    Das Problem ist, dass WIDTH zweimal verdoppelt wird. Zusätzliche Logik ist erforderlich, um einen korrekten Austausch zu gewährleisten.

    Ein cooler Regex-Trick, den du vielleicht nicht kennst:

    Hier ist eine modifizierte Version des ursprünglichen Programms, die den oben genannten Fehler behebt und eine (kommentierte) Version eines verbesserten Regex enthält:

     import re s = '<img src = "/" width="10" height="111" />' def a(x): b = x.group(0) if x.group(1): b = b.replace(x.group(1), "width=\""+ str(int(x.group(2))*2) +"\"") if x.group(3): b = b.replace(x.group(3), "width=\""+ str(int(x.group(4))*2) +"\"") return b reobj = re.compile(r''' <img # Start of IMG tag. (?: # Group for multiple attributes. \s+ # Attributes separated by whitespace. (?: # Group for attribute alternatives. (width\s*=\s*"(\d+)") # $1: WIDTH attribute, $2 value. | (height\s*=\s*"(\d+)") # $3: HEIGHT attribute, $4 value. |[^\s>]+) # Other IMG attributes. )+ # One or more attributes. [^>]*> # End of IMG tag. ''', re.IGNORECASE | re.VERBOSE) ss = re.sub(reobj, a, s) print ss 

    Beachten Sie, dass die WIDTH in Gruppen $ 1 und $ 2 und HEIGHT in Gruppen $ 3 und $ 4 erfasst wird, auch wenn ihre Reihenfolge in der Zielzeichenfolge umgekehrt wird. Ich wünschte, ich könnte sagen, dass ich diesen kühlen Trick gedacht habe, aber ich habe es nicht getan. Ich stahl es von einem von Steven Leveithans ausgezeichneten Blog-Posts: Capturing Multiple, optionale HTML-Attribut-Werte . Ziemlich nächtlich eh?

    Eine sauberere Regex-Lösung

    Klug wie das sein mag, es ist noch komplexer als es für diesen Job sein muss. Ich würde es einfach halten und mache nur zwei getrennte Ersatzoperationen wie so:

     import re s = '<img src = "/" width="10" height="111" />' def a(x): return x.group(1) + str(int(x.group(2))*2) ss = re.sub(r"(?i)(<img[^>]*?width\s*=\s*[\"'])(\d+)",a, s) ss = re.sub(r"(?i)(<img[^>]*?height\s*=\s*[\"'])(\d+)",a, ss) print ss 

    Kleiner Sauberer, leichter zu lesen und wahrscheinlich die schnellste Lösung. (Beachten Sie, dass die Rückruffunktion trivial wird.)

    Nichts Gutes wird kommen aus dem Versuch, Regex verwenden, um HTML zu analysieren. Egal was du tust, es wird schließlich brechen

    Also, verwenden Sie einen HTML-Parser wie Python's HTMLParser, wird es deklodieren alle HTML-Text und Sie müssen nur drucken Sie es wieder mit Ihren Änderungen.

    Auf einer anderen Anmerkung, das Ändern von html, wie Sie tun, sieht verdächtig aus. Sie machen wahrscheinlich etwas sehr hartes.

    Wieder einmal sollte diese Aufgabe perfekt von einem HTML-Parser gelöst werden, wie hier und hier vorgeschlagen .


    Wenn Sie noch zu diesem Zweck eine reguläre Ausdrücke verwenden möchten , können Sie diese stattdessen verwenden:

    <img.*?(width|height)=\"(\d+)\".*?(width|height)=\"(\d+)\"

    Beispielsweise:

    Im Text: <img src = "/" width="10" height="111"/> den folgenden Gruppen:

    • Gruppe 1: "width"
    • Gruppe 2: "10"
    • Gruppe 3: "height"
    • Gruppe 4: "111"

    Im Text: <img src = "/" height="111" width="10"/> es wird übereinstimmen:

    • Gruppe 1: "height"
    • Gruppe 2: "111"
    • Gruppe 3: "width"
    • Gruppe 4: "10"

    Jetzt passt es, egal ob die width vor der height oder umgekehrt ist, und ich denke, die 4 Gruppen geben dir genügend Infos, wenn du den Ersatz tust.

    Bearbeiten:
    Ich habe die height und width für dich erfasst, um zu wissen, welcher Wert zuerst übereinstimmt (andernfalls bekommst du 111 und 10 du nicht weißt, welcher ist die height und die width ), aber ich glaube nicht, dass das in deinem Fall notwendig ist Denn alles, was Sie tun müssen, ist, beide Werte zu duplizieren, könnte aber nützlich sein, falls Sie inkrementieren height und width in verschiedenen Werten wollen.

    Versuchen Sie mit folgendem Regex:

    <img.*?height=\"(\d+)\".*?width=\"(\d+)\"

    Group 1 erfasst die Höhe und Group 2 die Breite

    Python ist die beste Programmiersprache der Welt.