Interpretationsprobleme mit For Schleifen Bedingung

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,

ich hab mal kurz ne Frage, was bedeutet die Bedingung? Ich bin kein Python Profi, ich weiß nur das die Bedingugn anscheinend nciht eintritt, denn das Programm geht nciht in die For Schleife :cry:

Code: Alles auswählen

	for im,caption in re.findall(r'\[\[Image:([^\[\|]*)\|([^\[]*)\]\]', itext): 
der Code davor:

Code: Alles auswählen

def doImages(text):
	print text
	itext=text;
	for im,caption in re.findall(r'\[\[Image:([^\[\|]*)\|([^\[]*)\]\]', itext):
		print "Test"
was heißt das "im"!? Gib es eine gute Doku zu re.findall?
Ich versteh das nicht, eigentlich müsste er in die For-Schleife gehen sobald ein z.B. [[Image:Example.jpg]] im Text vorkommt, oder!?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dein Beispiel Text ist falsch. So geht's:

Code: Alles auswählen

import re

itext = "ein z.B. [[Image:Example.jpg|FooBar]] im [[Image:im|caption]] Text"

match = re.findall(r'\[\[Image:([^\[\|]*)\|([^\[]*)\]\]', itext)
print "match:", match
print

for im,caption in match:
    print "im.......:", im
    print "caption..:", caption
    print
Ausgabe:
match: [('Example.jpg', 'FooBar'), ('im', 'caption')]

im.......: Example.jpg
caption..: FooBar

im.......: im
caption..: caption
Jetzt macht es Sinn, oder?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

ich versteh's irgendwie net :cry:
ziel der methode ist es das textstück zu finden wo ein bild deklariert wird(bei dem Programm handelt es sich um ein Skript das wikitexte --> wikipedia in latex texte umwandelt um aus dem tex dokument ein pdf zu generieren)

Code: Alles auswählen

def doImages(text):
	print text
	itext=text;
	for im,caption in re.findall(r'\[\[Image:([^\[\|]*)\|([^\[]*)\]\]', itext):
		print "Test"
		# latex hates "_" and " "-chars (and probably many others as well), strip .jpg 	
    # pat: remove also \
		imName = re.sub(r'[ _\\]+','',im)
		#imName = re.sub(r'(.*)\.[^\.]*',r'\1',imName)
		imName = re.sub(r'\.(jpg|JPG|gif|GIF|jpeg|JPEG)$','.png',imName)
		# pat: convert the path (windows specific)
		path = sys.argv[3].replace("\\","/")
		print "path:" + path
		# convert all wikitags to image commands
		# pat, debug
		print "image Name: " + imName
		print "within path: " + sys.argv[3].replace("\\","/")
		itext=re.sub(r'\[\[Image:.*\]\]' , r'\\begin{figure}[!h] \n \\begin{center} \n  \\includegraphics[scale=0.5]{' + path + "/" + imName + '}\n \end{center} \n \\caption{'+caption+'} \n \\end{figure}', itext, count = 1)
	return itext
so das ist die ganze methode udn ich hab fest gestellt, dass das skript halt ncoh nciht mal in die for schleife rein geht...aus welchem grund auch immer

print "match:", match
print

wieso ist das 2. print leer?

ich hab's grad mal ausprobiert...also die ausgabe ist: match: [] das war's :cry:

was heisst das? das er nix findet!? aber [[Image:Example.jpg]] steht in text :!: ich versteh das nicht...hab mir vor dem match, den text ausgeben lassen:
dies ist ein test bla blubb
<special>XHNxcnR7XHN1bV8wXm5cLCBhX25eMn0=
</special>
immer noch
<special>XGluZiB6IFxzdXAgYSBcZXhwIGIgXGxuIGMgXGxnIGQgXGxvZyBlIFxsb2dfezEwfSBmIFxrZXIg
Z1wsXCE=
</special>
QZCBLQUfdzbwszwbreh
funued6ube
== Headline text ==
tjzurjrtu6
[[Image:Example.jpg]]
<special>XGRlZyBoIFxnY2QgaSBcUHIgaiBcZGV0IGsgXGhvbSBsIFxhcmcgbSBcZGltIG5cLFwh
</special>
<special>XGJvbGRzeW1ib2x7XHVwc2lsb259IFxib2xkc3ltYm9se1xwaGl9IFxib2xkc3ltYm9se1xjaGl9
IFxib2xkc3ltYm9se1xwc2l9IFxib2xkc3ltYm9se1xvbWVnYX1cLFwh
</special>
bei den komischen <special> Tags nicht's bei denken, das stimmt schon so...aber die hauptsache ist ja, dass Image eindeutig drin steht... :roll:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das "leere" print ist nur dazu da eine leere Zeile zu erstellen ;)

Also das Problem ist, das die RE nur für Bilder gemacht ist, die eine Beschreibung haben. Also sie matcht nicht auf [[Image:Example.jpg]] sondern nur auf [[Image:Example.jpg|FooBar]]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

puh...ok

und gibt es da ne andere möglichkeit mit python!? etwas allgemeingültigeres?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da dürfte es mehrere Wege geben...

Du könntest du RE ändern von:

Code: Alles auswählen

r'\[\[Image:([^\[\|]*)\|([^\[]*)\]\]'
IMHO in (ungetestet):

Code: Alles auswählen

r'\[\[Image:([^\[\|]*)\]\]'
Dann müstest du auch die for Schleife ändern, weil nicht mehr zwei Sachen (im un caption) gleichzeitig gefunden werden, sondern nur noch eine, der Dateiname des Bildes...

Wobei die gesammte Schleife sieht etwas Haarig aus...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

wieso sieht die schleife haarig aus?

also ich kenne mich kaum mit Python aus...die Extension wurde halt von jemanden anders geschrieben, aber wie du selber siehst beinhaltet sie ein paar Fehler ich grad versuch wegzukriegen, damit es bei mir funzt....

müsste ich die schleife, dann nicht einfach auf for im in match kürzen!? was für Kritik hast du an der Schleife, immer her damit!!!
mondschein
User
Beiträge: 52
Registriert: Dienstag 11. März 2008, 16:35

Code: Alles auswählen

itext=re.sub(r'\[\[Image:.*\]\]' , r'\\begin{figure}[!h] \n \\begin{center} \n  \\includegraphics[scale=0.5]{' + path + "/" + imName + '}\n \end{center} \n \\caption{'+caption+'} \n \\end{figure}', itext, count = 1)
hab deins grad probiert, aber mti dem obigen hat er irgendwie probleme :cry:
match: ['Example.jpg']
im.......: Example.jpg
Test
path:extensions/wikipdf/tmp/1205484932-407223349
image Name: Example.png
within path: extensions/wikipdf/tmp/1205484932-407223349
Traceback (most recent call last):
File "extensions/wikipdf/src/wiki2latex.py", line 663, in ?
tex_code += doWiki(wiki_code)
File "extensions/wikipdf/src/wiki2latex.py", line 618, in doWiki
text = doImages(text)
File "extensions/wikipdf/src/wiki2latex.py", line 583, in doImages
itext=re.sub(r'\[\[Image:.*\]\]' , r'\\begin{figure}[!h] \n \\begin{center} \n \\includegraphics[scale=0.5]{' + path + "/" + imName + '}\n \end{center} \n \\caption{'+caption+'} \n \\end{figure}', itext, count = 1)
NameError: global name 'caption' is not defined

kann das sein weil er irgendwie nen ong aus dem bild machen will!?-->image Name: Example.png das bild is ja eigentlihc nen jpeg, oder hab ich das programm falsch verstanden!?
Antworten