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:
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
aber leider weiss ich nicht wie man es in Python macht?
Verfasst: Samstag 19. September 2009, 11:27
von Dav1d
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
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.