regular expression problem

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.
Antworten
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hi,
Wie ist es moeglich SA01m in SA01 mit regular expression zu erstetzen?

Code: Alles auswählen

import re

l = ['m_SA01m_v.txt', 'm_SA04m_v.txt', 'm_SA19m_v.txt']
for i in l:
	print i.replace('simple', 'short')
Um die folgende Loesung zu erhalten:
l = ['m_SA01_v.txt', 'm_SA04_v.txt', 'm_SA19_v.txt']

Vielen Dank
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würds mit `re.sub()` angehen:

Code: Alles auswählen

In [9]: re.sub(r"(m_SA\d\d)m(_v)", r"\1\2","m_SA01m_v.txt")
Out[9]: 'm_SA01_v.txt'
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

p = re.compile('([A-Z]{2}\d{2})m')
l = [p.sub('\\1', e) for e in l]
Hyperion: du brauchst bei ``sub`` nicht noch weitere Gruppen zu definieren, weil das was nicht gematcht wird, wird sowieso unverändert übernommen. Und ich finds sinnvoller die Regex zu kompilieren, wenn man sie mehrfach ausführen will.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben: Hyperion: du brauchst bei ``sub`` nicht noch weitere Gruppen zu definieren, weil das was nicht gematcht wird, wird sowieso unverändert übernommen.
Danke, das war mir nicht klar. Wieder was gelernt :-)
Leonidas hat geschrieben: Und ich finds sinnvoller die Regex zu kompilieren, wenn man sie mehrfach ausführen will.
Sicher, ich dachte das überlasse ich mal dem OP :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Ich have folgende Scala RegExp:

Code: Alles auswählen

scala> val c1reg = """.*%s=(\w)=(\d+);.*""".format('J').r 
c1reg: scala.util.matching.Regex = .*J=(\w)=(\d+);.*
scala> val c1reg(c1_b_type, c1_b_count) = "A=X=1;J=A=3;"
c1_b_type: String = A
c1_b_count: String = 3
Wie koennte man diese in Python konventieren?

Vielen Dank im Voraus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die braucht man meines Erachtens nicht konvertieren, Pythons ``re``-Modul müsste die auch einfach verarbeiten können.
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

Code: Alles auswählen

import re
for t, c in re.findall(r"J=(\w+)=(\d+);", "A=X=1;J=A=4;"):
    print t, c
Stefan
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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

Code: Alles auswählen

>>> a = 'xyzfffd'
>>> 'x' in a
True
>>> 'xf' in a
False
Wie kann man testen (vielleicht mit regular expression) ob x oder/und f vorhanden ist?
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

mit hat geschrieben:

Code: Alles auswählen

>>> a = 'xyzfffd'
>>> 'x' in a
True
>>> 'xf' in a
False
Wie kann man testen (vielleicht mit regular expression) ob x oder/und f vorhanden ist?
Das ginge auch ohne regex mit 'or' und 'and'.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oder allgemeiner mit Mengen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

if set('xf') & set(a):
    # a enthält x, f oder x und f
BlackJack

``set('fx').issubset(a)`` ist vielleicht etwas lesbarer und es wird kein unnötiges Ergebnis-`set` erstellt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn schon wäre es `set.intersection()`, denn der OP möchte ja auch ein `True` erhalten, wenn `x` *oder* `f` vorhanden ist. Zumindest habe ich ihn so verstanden.
Antworten