Reguläre Ausdrücke

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
ich habe hier ( http://webloria.loria.fr/~szathmar/off/ ... /index.php ) eine Seite gefunden die eine Gegenüberstellung zwischen den Regulären Ausdrücken in Perl und in Java zeigt.

Meine Frage ist wie würde dies in Python aussehen?

Vielen Grüße
BlackJack

@mit: Idiomatisches Python würde bis auf das letzte Beispiel keine regulären Ausdrücke benötigen. Und auch für das letzte Beispiel würde ich einen echten HTML-Parser regulären Ausdrücken vorziehen.

Code: Alles auswählen

from __future__ import with_statement
import re
from BeautifulSoup import BeautifulSoup


def main():
    EXTENSION = '.lst'
    text = 'Asian.lst'
    filename = None
    if text.endswith(EXTENSION):
        filename = text[:-len(EXTENSION)]
    print filename
    
    # -------------------------
    
    if 'ian' in text:
        print "Contains 'ian'"
    
    # -------------------------
    
    with open('input.txt') as lines:
        for line in lines:
            if 'dog' in line.lower():
                print line,

    # -------------------------

    text = 'a dog and a dog'
    text = text.replace('dog', 'cat', 1)
    print text
    text = text.replace('dog', 'cat')
    print text
    
    # -------------------------
    
    text = '<a href="ad1">sdqs</a><a href="ad2">sds</a><a href=ad3>qs</a>'
    for value in re.findall(r'href="?([\w]+)"?', text, re.IGNORECASE):
        print value

    # Alternative:
    
    soup = BeautifulSoup(text)
    for value in (a['href'] for a in soup('a')):
        print value


if __name__ == "__main__":
    main()
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn es darum geht, zu sehen, wie reguläre Ausdrücke benutzt werden, ist es natürlich ein bisschen merkwürdig, gar keine zu benutzen. Daher:

Code: Alles auswählen

import re

# get a group from a string

text = "aslan.lst"
m = re.search(r"(.*)\.lst", text)
if m:
    print "found", m.group(1)

# match string against a regexp

m = re.search(r"lan", text)
if m:
    print text, "contains 'lan'"

# read a file line by line and match regexp

r = re.compile("dog", re.I)
with open("/tmp/input.txt") as f:
    for line in f:
        m = r.search(line)
        if m:
            print line,

# replace first, then all occurences

text = "a vargr and another vargr"
print re.sub("vargr", "hiver", text, 1)
print re.sub("vargr", "hiver", text)

# find all occurences of a substring in a string

text = '<a href="ad1">sdqs</a><a href="ad2">sds</a><a href=ad3>qs</a>'
for m in re.finditer('href="?(.*?)"?>', text):
    print m.group(1)
Bei Python ist lästig, dass man immer erst in einer Zeile das Match-Objekt zuweisen muss. Will man das immer und immer wieder machen, ist vielleicht eine globale Variable ganz praktisch:

Code: Alles auswählen

def search(p, s): global match; match = re.search(p, s); return match

def group(n=0): return match.group(n)

text = "aslan.lst"
if search(r"(.*)\.lst", text):
    print "found", group(1)
Stefan
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Vielen Dank. Wie lernt man am besten Reguläre Ausdrücke gibt es ein gutes Buch oder Howtos?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://www.regular-expressions.info/

Daneben gibts natuerlich ein wunderbares How-To in der Python Dokumentation: http://docs.python.org/howto/regex.html
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, es gibt das Buch vom Friedl was quasi der Klassiker zum Thema Regular Expressions ist. Wohl auch das einzige Buch zu dem Thema, also von dem her kein Wunder :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

mit hat geschrieben:Vielen Dank. Wie lernt man am besten Reguläre Ausdrücke gibt es ein gutes Buch oder Howtos?
Doku und ab und zu ein bisschen Trial und Error haben mir eigentlich ausgereicht.

Stefan
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Bei Trial and Error kann z.B. KiKi helfen.
MfG
HWK
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Oder Kodos http://kodos.sourceforge.net/
Sogar in Python geschrieben ;)
Edit: Ok, Kiki ist das auch.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Oder ein gutes Buch über Formale Sprachen ;)
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke für die Links und Tipps.

Leider weiss ich nicht wie diesen Perl Code:

Code: Alles auswählen

$com = 'ADFdiKL'
$com =~ tr/ADFadf/XYZxyz/;
in Python umschreibt. Dieser Perl Code ersetzt A mit X, d mit y usw..

Wie würde dies in Python aussehen?
BlackJack

Das würde man so lösen:

Code: Alles auswählen

In [10]: import string

In [11]: com = 'ADFdiKL'

In [12]: com.translate(string.maketrans('ADFadf', 'XYZxyz'))
Out[12]: 'XYZyiKL'
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke es hat funktioniert.

Dieser Code zählt in Perl das vorkommen von A oder a in einem String

Code: Alles auswählen

$a = ($ace =~ tr/Aa//);
aber leider weiss ich nicht wie man es in Python macht?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Code: Alles auswählen

a = 0
for i in ace:
    if i=='a':
        a += 1
print a
the more they change the more they stay the same
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn schon dann `if i == 'a' or i == 'A'`, aber es gibt einen deutlich einfacheres Weg für Strings.

Stefan
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

jo stimmt, ist mir jetzt auch wieder eingefallen

Code: Alles auswählen

a = 'ich bIn ein StrIng'
print a.lower().count('i')
Ergebnis:

Code: Alles auswählen

>>> a = 'ich bIn ein StrIng'
>>> print a.lower().count('i')
4
>>> a
'ich bIn ein StrIng'
the more they change the more they stay the same
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke hat funktioniert
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Wie würde der folgender Perl Code in Python aussehen?

Code: Alles auswählen

my ($x1, @model1) = split /\s+/, "AXDA     .255 .245 .245 .255";    
print $x1, "\n";
print @model1, "\n";
my ($x2, @model2) = split /\s+/, "CYEC	  .225 .275 .275 .225";
print $x2, "\n";
print @model2, "\n";

my @lod = map(lg($model1[$_]/$model2[$_]), (0..3));
print @lod, "\n";

my $a = "aagcaaatccgcgataaaattgccttggggcgtataaaagg";
$a =~ tr/acgtACGT/01230123/;
print $a, "\n";
my $score = sum(map($lod[$_], split //,$a));
print $score, "\n"; 
Ausgabe:

Code: Alles auswählen

AXDA
.255.245.245.255
CYEC
.225.275.275.225
0.180572245641821-0.166649869409451-0.1666498694094510.180572245641821
00210003112120300003321133222212303000022
1.15346400039175
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das ist doch eine neue Frage. Lege dafür doch einen neuen Thread an. Aber es wäre schon schön, wenn du selbst etwas Eigeninitiative zeigst, statt andere den Perl-Code übersetzen zu lassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Richtig. Wir sind hier kein Perl Forum. Probier es selbst und wenn du konkrete Fragen zu Python hast, kannst du die gerne hier stellen.
Bottle: Micro Web Framework + Development Blog
Antworten