verstehe regulären Ausdruck nicht

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
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

Hallo,
kann mir bitte jemand helfen, ich bin mir total unsicher was dieses Reguläre Audruck sucht:
(.*?)
weil wenn ich:

Code: Alles auswählen

	temp = re.compile('<ref name="(.*?)">(.*?)</ref>', re.DOTALL)
hab, dann findet er auch alles sachen die <ref name="(.*?)"/> sind und die will ich ja grad nciht haben...also mach ich ja irgendwas falsch... :-(
aber ich weiß nicht genau was...

Danke für jeden Tipp
Mondschein
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

mondschein hat geschrieben:

Code: Alles auswählen

	temp = re.compile('<ref name="(.*?)">(.*?)</ref>', re.DOTALL)
hab, dann findet er auch alles sachen die <ref name="(.*?)"/> sind und die will ich ja grad nciht haben.
WORKSFORME :)

Code: Alles auswählen

import re

temp = re.compile('<ref name="(.*?)">(.*?)</ref>', re.DOTALL)
m = temp.match('<ref name="foo">bar</ref>')
print m.groups() # => ('foo', 'bar')
m = temp.match('<ref name="foo"/>')
print m.groups() # => 
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#AttributeError: 'NoneType' object has no attribute 'groups'
https://www.xing.com/go/invite/18513630.6a91d4
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

:oops: kannst du mir kurz erklären was das da macht? würd das auch gern verstehen...weil so vom hingucken is mir grad nicht ganz klar warum das foo und bar? also irgendwie schon...weil ich durch die beiden platzhalter die "normelen" <ref> und die >ref/> gruppieren kann...nee?

Danke aber trotzdem schonmal :D
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

muss ich die dann nicht anders benennen?überschreibt der des jetzt nicht grad?
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

hab's jetzt grad ausprobiert, aber da kommt's zu nem fehler:

AttributeError: 'NoneType' object has no attribute 'groups'

:?: :?: :?:
martin.py
User
Beiträge: 10
Registriert: Sonntag 8. Juni 2008, 18:42

hi,

zu (.*?): die Zusammensetzung *? bedeutet bei regular Expressions 'nicht gierig', d.h. es wird das kürzeste Ergebnis ausgegeben. Bsp aus der Ge-Packt Referenz:

>>> findall('<.*?>', '<h1> Meine Homepage </h1>')
['<h1>','<h1>']

die kürzesten Ergebnisse sind hier eben <h1>, ein gieriger Ausdruck (.*) würde das längste Ergebnis ergeben:

>>> findall('<.*>', '<h1> Meine Homepage </h1>')
['<h1> Meine Homepage </h1>']

gruß
[/quote]
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

"foo" und "bar" sind einfach nur Platzhalter.

Jedenfalls solltest du zum Parsen von XML/HTML lieber ne ordentliche Bibliothek nehmen. lxml oder BeautifulSoup.
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

@Martin: ah danke für die Erklärung :-)
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

"re.compile" erzeugt eine "Regular Expression Object", dessen Methode "match", angewandt auf eine String s, ein "Match Object" liefert. Dieses Match-Objekt enthält die mit Klammerpaaren agegebenen Gruppen, sofern der Reguläre Ausdruck auf den String s gepasst hat. Im ersten Beispiel sind die beiden Gruppen die Strings "foo" und "bar". Die Methode "groups" des Match-Objekts liefert diese.

Ersetzt wird im gesamten Code nichts.

Ein Tutorial zu Regulären Ausdrücken findest Du hier: http://www.amk.ca/python/howto/regex/
https://www.xing.com/go/invite/18513630.6a91d4
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

@audax: das sind aber keine globalen platzhalter oder? kurz zur erklärung:
ich parse kein xml/html ich verbessere eine wiki-extension die wikitext ind latex umwandelt umd aus wikiartikeln pdf's zu generieren. Gerade im Moment bin ich dabei aus den ganzen Wikireferenzen (also Literaturrefernezen im Wikitext) ein Literaturverzeichnis in Latex zu erstellen...

wenn die Inhalt von Foo und Bar also nciht dynamisch sein können, sondern lutz.horn meinte das ich hier in den regulären ausdruck schon reinschreibe was ich suche (was ja nciht geht, weil im artikel mehrere verschiedene Referenezn da sind). Gibt es da noch ne andere Möglichkeit? Oder habe ich irgend etwas falsch verstanden?

Danke für die Geduld
Mondschein
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

mondschein hat geschrieben:hab's jetzt grad ausprobiert, aber da kommt's zu nem fehler:

AttributeError: 'NoneType' object has no attribute 'groups'

:?: :?: :?:
Genau, denn '<ref name="foo"/>' passt nicht auf den Regulären Ausdruck. Die Rückgabe von "match" is deswegen None.
https://www.xing.com/go/invite/18513630.6a91d4
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

also kann ich deine lsg. nciht nehmen, da ich ja nciht weiß was in foo und bar steht...da der inhalt ja wie gesagt immer unterschiedlich is, hab ich jetzt das schon richtig verstanden oder?
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

deshalb stand ja (.*?) im regulären Ausdruck, aber das liefert ja beide möglichen refs :cry:
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

mondschein hat geschrieben:also kann ich deine lsg. nciht nehmen, da ich ja nciht weiß was in foo und bar steht...da der inhalt ja wie gesagt immer unterschiedlich is, hab ich jetzt das schon richtig verstanden oder?
Nein, das has Du nicht richtig verstanden.

Deine ursprüngliche Frage war ja, dass auch Strings wie zum Beispiel '<ref name="foo"/>' vom Regulären Ausdruck '<ref name="(.*?)">(.*?)</ref>' erfasst würden, was definitiv nicht der Fall ist. Nur das habe ich in meinem Beispiel demonstriert.

Was willst Du denn genau erreichen?
https://www.xing.com/go/invite/18513630.6a91d4
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

also bei einem Text:
<ref name=“test”>Dies ist eine O’Reiliiy Reference S.16-18</ref> blas hier text
und hier auch<ref name=“test”/> ja und heir geht es weiter lustig text und so<ref
name=“test”/>...jetzt probieren wir mal eine neue<ref name=“test2”>dies is eine total cool
addison referneces s. 90</ref> mal gucken ob das funktioniert<ref name=“test2”/>...mhm
und das literraturverzeichnis...wie sieht das aus?
und dem Code:

Code: Alles auswählen

	temp = re.compile('<ref name="(.*?)">(.*?)</ref>', re.DOTALL)
	match = temp.findall(text)
	
	for ref in match:
		print ref
kommt die Ausgabe:
('test', "Dies ist eine O'Reiliiy Reference S.16-18")
('test"/> ja und heir geht es weiter lustig text und so<ref name="test"/>...jetzt probieren wir mal eine neue<ref name="test2', 'dies is eine total cool addison referneces s. 90')
und was ich suche is nen regulärer ausdruck der mir lauter sachen, wie die erste liste gibt. Und ich frag mich halt was an meinem regulären Ausdruck falsch ist warum er anfängt mir 'test"/> ja und heir geht es weiter lustig text un... zurück zugeben...

:cry: :cry: :cry:
martin.py
User
Beiträge: 10
Registriert: Sonntag 8. Juni 2008, 18:42

Hi,

das Problem ist dass der Reguläre Ausdruck eben (als 1. Gruppe) alles ausgibt, was zwischen <ref name=" und "> steht zurückgibt. bei:
<ref name=“test”/> ist dies nicht nur das Wort test, weil danach "/> kommt und nicht nur "> deswegen sucht er solange, bis er "> findet, was an der stelle name=“test2”>dies passiert (siehe ">).

Du musst also (unter vorbehalt, kanns grad nicht testen) noch einbauen, dass wischen dem " und > der Backslash ein- oder keinmal vorkommen kann.

Gruß
Antworten