Seite 1 von 2

Reguläre Ausdrücke

Verfasst: Sonntag 6. September 2009, 01:50
von mit
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

Verfasst: Sonntag 6. September 2009, 06:20
von 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()

Verfasst: Sonntag 6. September 2009, 08:59
von sma
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

Verfasst: Dienstag 8. September 2009, 22:58
von mit
Vielen Dank. Wie lernt man am besten Reguläre Ausdrücke gibt es ein gutes Buch oder Howtos?

Verfasst: Dienstag 8. September 2009, 23:07
von cofi
http://www.regular-expressions.info/

Daneben gibts natuerlich ein wunderbares How-To in der Python Dokumentation: http://docs.python.org/howto/regex.html

Verfasst: Mittwoch 9. September 2009, 10:56
von Leonidas
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 :)

Verfasst: Donnerstag 10. September 2009, 21:54
von sma
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

Verfasst: Freitag 11. September 2009, 12:48
von HWK
Bei Trial and Error kann z.B. KiKi helfen.
MfG
HWK

Verfasst: Freitag 11. September 2009, 13:23
von cofi
Oder Kodos http://kodos.sourceforge.net/
Sogar in Python geschrieben ;)
Edit: Ok, Kiki ist das auch.

Verfasst: Freitag 11. September 2009, 18:28
von Panke
Oder ein gutes Buch über Formale Sprachen ;)

Verfasst: Samstag 19. September 2009, 07:41
von mit
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?

Verfasst: Samstag 19. September 2009, 08:41
von 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'

Verfasst: Samstag 19. September 2009, 11:24
von mit
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?

Verfasst: Samstag 19. September 2009, 11:27
von Dav1d

Code: Alles auswählen

a = 0
for i in ace:
    if i=='a':
        a += 1
print a

Verfasst: Samstag 19. September 2009, 11:31
von sma
Wenn schon dann `if i == 'a' or i == 'A'`, aber es gibt einen deutlich einfacheres Weg für Strings.

Stefan

Verfasst: Samstag 19. September 2009, 11:44
von Dav1d
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'

Verfasst: Dienstag 29. September 2009, 11:45
von mit
Danke hat funktioniert

Verfasst: Mittwoch 14. Oktober 2009, 06:50
von mit
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

Verfasst: Mittwoch 14. Oktober 2009, 10:17
von Leonidas
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.

Verfasst: Mittwoch 14. Oktober 2009, 11:20
von Defnull
Richtig. Wir sind hier kein Perl Forum. Probier es selbst und wenn du konkrete Fragen zu Python hast, kannst du die gerne hier stellen.