[python] reguläre ausdrücke


mondschein85

Mitglied
hallo,

kur zu den Umständen meines Problems:
bin absoluter Python Newbie und auch in Bereich Reguläre Ausdrück völlig neu, aber lernbereit

ich benutze Mediawiki 1.10 und habe dort eine Extension (Wikipdf: http://sourceforge.net/projects/wikipdf/). die Scripts der Extension sind in Python geschrieben.
Mein Problem is nun das die Skripts Fehler haben, die ich beheben will...habe mir auch schon ein paar Python Bücher geholt und im Internet gegooglet doch irgendwie check ich den Ablauf des Hauptprogramms nicht:

Code: http://paste.pocoo.org/show/32961/

ich weiß das war jetzt ne menge code
in zeile 108 beginnt der translate ausdruck...hier wird mir regulären ausdrücken gearbeitet
und ab zeile 530 geht glaube ich mein problem los...jedenfalls so weit ich das beurteilen kann.

noch ganz kurz was das eigentliche problem ist:
ich hab einen wiki eintrag dort werden latex befehle mit <math></math> gewrappet aber innen drin stehen schon die richtigen latex befehle...mit meiner extension verwandle ich den wiki code in latex um um dann daraus ein pdf zu generieren...

ein paar versuche etwas in der translation tabelle regeln zu ändern habe ich schon (auch bei anderen befehlen, wo es allerdings funktioniert)...aber die führen entweder zu satten fehlern oder bringen trotzdem nur ne falsche ausgabe...

was meine meinung nach richtig aussieht(,aber da ich nciht wirklcih ahnugn von regulären ausdrücken habe, dies ncihts zu sagen hat) ist:

Zitat:
( '(?s)<math>(.*?)</math>' , r'\\${\1}\\$' ),
durch das r' reicht ein \ um den \ zu schützen oder°!?

naja die dementsprechende ausgabe dannach ist:

TeX:
Zitat:
${\sqrt\{\sum\_0\^{}n a\_n\^{}2\}}$
richtig wär:
Zitat:
\sqrt{\sum_0^n a_n^2}
(und so steht es ja auch im wiki code)...

was amche ich falsch...ich will doch nur das er die <math> und </math> mit /$ ersetzt und den rest so lässt...bin völlig am verzweifeln


liebe grüße mondschein85
 

deepthroat

Erfahrenes Mitglied
Hi.
( '(?s)<math>(.*?)</math>' , r'\\${\1}\\$' ),
durch das r' reicht ein \ um den \ zu schützen oder°!?
Ja.
naja die dementsprechende ausgabe dannach ist:

TeX:
Zitat:
${\sqrt\{\sum\_0\^{}n a\_n\^{}2\}}$
richtig wär:
Zitat:
\sqrt{\sum_0^n a_n^2}
(und so steht es ja auch im wiki code)...
Wie ist denn die Eingabe? Und in welche Zeile hast du denn das Tupel hinzugefügt? Sicher doch vor Zeile 165-166, oder?!

Gruß
 

mondschein85

Mitglied
also als och das ausprobier hatte, habe ich zeile 167 und 168 auskommentiert und es einfach drunter hinzugefügt.
ein hauptproblem is, dass das probgramm den text der zwischen den <math<</math> tupel steht, da jedes "wort" neu durch die übersetzungstabelle schickt...und dem entsprechen alle \ nochmal mit \ gewrapped (geschützt) werden...da sie ja in latex ne andere bedeutung haben...aber genau das will ich ja nicht...ich will dass das programm sieht aha hier is <math> so dann lassen wir alle wörter bis </math> einfach wie sie sind und dann geht's normal weiter im programm :(

ich glaube der ansatzpunkt liegt ab zeile 530...weil hier wird ja alles mit math gesucht gecentert und mit text = re.sub(r'\$', r'\$', text) gewrapped oder!? ich versteh sowie so nicht so richtig wie das alles funktioniert...
also ich krieg den ganzen text und dann sucht die funktion dowiki den text stück für stück durch um dann in der for schleife die einzelnen übersetzungen zu machen d.h. der string text wird die ganze zeit verändert und gleichzeitig gespeichert...oder
gibt es nciht eine möglichkeit praktisch die kommenden wörte ab <math> bis </math> zu überspringen°?

liebe grüße
mondschein85
 

deepthroat

Erfahrenes Mitglied
Hi.

Könntest du das alles auch so formulieren, das man es verstehen kann? Und bitte halte dich an die Netiquette Punkt 14! Oder ist deine Umschalttaste kaputt? :suspekt:
also als och das ausprobier hatte, habe ich zeile 167 und 168 auskommentiert und es einfach drunter hinzugefügt.
Warum darunter? Dann hat dein Tupel doch gar keine Wirkung mehr, denn <math> und </math> werden doch bereits in Zeile 165-166 ersetzt... (wir sprechen doch von der Datei http://paste.pocoo.org/show/32961/ oder?)
ein hauptproblem is, dass das probgramm den text der zwischen den <math<</math> tupel steht, da jedes "wort" neu durch die übersetzungstabelle schickt...und dem entsprechen alle \ nochmal mit \ gewrapped (geschützt) werden...da sie ja in latex ne andere bedeutung haben...aber genau das will ich ja nicht...ich will dass das programm sieht aha hier is <math> so dann lassen wir alle wörter bis </math> einfach wie sie sind und dann geht's normal weiter im programm :(

ich glaube der ansatzpunkt liegt ab zeile 530...weil hier wird ja alles mit math gesucht gecentert und mit text = re.sub(r'\$', r'\$', text) gewrapped oder!?
Wovon sprichst du? In Zeile 530 steht "return itext"?!
also ich krieg den ganzen text und dann sucht die funktion dowiki den text stück für stück durch um dann in der for schleife die einzelnen übersetzungen zu machen d.h. der string text wird die ganze zeit verändert und gleichzeitig gespeichert...oder
Ja.
gibt es nciht eine möglichkeit praktisch die kommenden wörte ab <math> bis </math> zu überspringen°?
Wenn man es umprogrammiert...

Gruß
 

mondschein85

Mitglied
Hallo,

natürlich ist mein Umschalttaste nicht kaputt :suspekt:...Es ist ehr Gewohnheit :(, aber ich werde mir in Zukunft Mühe geben.
Genau ich meine den Link, aber ich glaube entweder verrutsche ich andauernd beim gucken um ein paar Zeilen oder du, oder evtl. liegt es auch am Browser. :confused:

Die Zeilen die ich meine:

( r'(?s)<math>(.*?)' , r'\\begin{equation}' ),
( r'(?s)</math>(.*?)' , r'\\end{equation}' ),
diese waren auskommentiert, bei meinem Testlauf.

Mein Problem fängt mit der Funktion/Methode: def doWiki(text): (dies sollte sich dann bei dir in Zeile 533 befinden, oder?)

In welcher FOrm könnte ich das Ganze umprogrammieren? Was hast du für eine Idee?

Liebe Grüße Mondschein85
 

mondschein85

Mitglied
Du sag mal, im Punkt 14 steht:

Erstelle aussagekräftige Betreff-Zeilen für Deine eigenen Beiträge. Mit nicht aussagekräftigen Betreff-Zeilen wie z.B. "Hilfe, komme nicht weiter" oder "Photoshop braucht Hilfe!" belegst Du nur, dass Du die Netiquette unseres Forums nicht gelesen oder verstanden hast, oder es Dir an der notwendigen Reife für ein solches Informationsmedium fehlt. Beiträge mit mangelhaften Betreff-Zeilen werden ohne Vorwarnung gelöscht und der Account (ggf. erst bei einer Wiederholungstat) unbefristet gesperrt.

Ich bin mir nicht sicher wie man mein Problem konkretisieren könnte, da ich mich wie gesagt kaum mit Python oder Regulären Ausdrücken auskenne. Sorry:(
 

deepthroat

Erfahrenes Mitglied
natürlich ist mein Umschalttaste nicht kaputt :suspekt:...Es ist ehr Gewohnheit :(, aber ich werde mir in Zukunft Mühe geben.
Genau ich meine den Link, aber ich glaube entweder verrutsche ich andauernd beim gucken um ein paar Zeilen oder du, oder evtl. liegt es auch am Browser. :confused:
Ja, hab selber grad gesehen, das die Zeilennummern völlig unnütz sind - zumindest im IE.
Die Zeilen die ich meine:

( r'(?s)<math>(.*?)' , r'\\begin{equation}' ),
( r'(?s)</math>(.*?)' , r'\\end{equation}' ),
diese waren auskommentiert, bei meinem Testlauf.
Ja, gut. OK.
Mein Problem fängt mit der Funktion/Methode: def doWiki(text): (dies sollte sich dann bei dir in Zeile 533 befinden, oder?)
Ja, davor steht 533...
In welcher FOrm könnte ich das Ganze umprogrammieren? Was hast du für eine Idee?
Man könnte ja vorher den <math>...</math> Abschnitt enkodieren, so das dieser nicht mehr von den anderen Ersetzungen betroffen ist.

Nach der Übersetzung müßtest du die entsprechenden Stellen wiederfinden und dekodieren.

Gruß
 

mondschein85

Mitglied
Was heißt den encodieren'? Hab das noch nie gehört.:eek:

Vielleicht könnte man ja eine Variable an der Stelle einfügen, geht das in Python? Weil dann könnte man die Inhalte der jeweils richtigen Variable zuweisen:

vom Prinzip:
while text=<math>
count++ (irgendeine Zahl die hochzählt bei jedem Schleifendurchgang)
array(count)= text
do

Könnte man sowas in Python umsetzten und wie könnte ich an die Stelle im Text eine variable ersetzten?

Oder hast du eine andere Idee?
 

mondschein85

Mitglied
Was mir gerade noch für eine Idee kommt: könnte man sagen, dass wenn <math> kommt, das Programm ein anderes Wörterbuch aufruft?
Das wär doch eigentlich eine ziemlich simple und leicht umzusetzende Idee, oder was meinst du?
 

mondschein85

Mitglied
P.S. Du bist ja lustig:). Was ein Kodierer ist, wußte ich schon, aber nicht wie man das in Python umsetzt.
Kannst du mir das Prinzip deiner Idee erklären?
 

deepthroat

Erfahrenes Mitglied
Was mir gerade noch für eine Idee kommt: könnte man sagen, dass wenn <math> kommt, das Programm ein anderes Wörterbuch aufruft?
Das wär doch eigentlich eine ziemlich simple und leicht umzusetzende Idee, oder was meinst du?
Dazu müßtest du den Text erstmal an den Stellen auseinanderschneiden und jeden Teil entsprechend verarbeiten, zum Schluß wieder zusammensetzen.
P.S. Du bist ja lustig:). Was ein Kodierer ist, wußte ich schon, aber nicht wie man das in Python umsetzt.
Kannst du mir das Prinzip deiner Idee erklären?
Man könnte z.B. urllib.quote und urllib.unquote verwenden um die Spezialzeichen zu kodieren / dekodieren. Die <math> und </math> könnte man ja durch <specialmath> bzw. </specialmath> ersetzen damit man die kodierten Stellen nachher wiederfindet...

Gruß
 

mondschein85

Mitglied
Wie kann man:

1. Den Text auseinanderschneiden?
2. Diese Textteile speichern? --> Array() ?
3. Wie mach ich das beim kodieren, dass das Programm dann wirklich erst ab der Stelle hinter </math> mit Translate übersetzt?

P.S. Kennst du ein gutes Tutorial für urllib? Hab beim googlen nicht's brauchbares gefunden.
 

mondschein85

Mitglied
Also habe hier etwas zu urllib.quote() gefunden, aber es verwirrt mich ein bisschen:

Utility functions

urllib.quote(str) # Quotes a string for use in a URL
urllib.quote_plus(str) # Also replaces spaces with '+'
urllib.unquote(str) # Opposite of quote()
urllib.unquote_plus(str) # Opposite of quote_plus()
urllib.urlencode(dict) # Turns a dictionary of key=value
# pairs into a HTTP query-string

Da es sich bei den Textbausteinen innerhalb <math> um mathematische Formeln handelt, würde ja schon allein jedes "+" mit "%20" ersetzt werden, oder? :suspekt:
Das heißt, danach wär ich wieder an dem Punkt wo ich es nochmal übersetzten müsste? Oder hab ich was falsch verstanden? Achso und sobald ich unquote() mache, geht alles von allein rückgängig?(!) Hab ich das richtig verstanden?
 

deepthroat

Erfahrenes Mitglied
Also habe hier etwas zu urllib.quote() gefunden, aber es verwirrt mich ein bisschen:

Utility functions

urllib.quote(str) # Quotes a string for use in a URL
urllib.quote_plus(str) # Also replaces spaces with '+'
urllib.unquote(str) # Opposite of quote()
urllib.unquote_plus(str) # Opposite of quote_plus()
urllib.urlencode(dict) # Turns a dictionary of key=value
# pairs into a HTTP query-string

Da es sich bei den Textbausteinen innerhalb <math> um mathematische Formeln handelt, würde ja schon allein jedes "+" mit "%20" ersetzt werden, oder? :suspekt:
Das heißt, danach wär ich wieder an dem Punkt wo ich es nochmal übersetzten müsste? Oder hab ich was falsch verstanden? Achso und sobald ich unquote() mache, geht alles von allein rückgängig?(!) Hab ich das richtig verstanden?
Ja.

Gruß
 

mondschein85

Mitglied
Und wie mach ich das dann konkret? Ich google, die ganze Zeit schon nach Codebausteinen, aber was hilfreiches kann ich nicht finden. :(
Wie gesagt ich hab null Ahnung von Python als Programmiersprache.
 

deepthroat

Erfahrenes Mitglied
Da sind doch genug Codebausteine drin, oder nicht?

Python:
def encodeMath(x):
  return "<special>" + urllib.quote(x.group(1)) + "</special>"

text = re.sub(r'(?s)<math>(.*?)</math>', encodeMath, text)
Gruß
 

mondschein85

Mitglied
hab ich dann nciht trotzdem noch das gleiche Problem?

Weil irgendwann später kommt ja:
Code:
	for trans_tuple in translate1:
		# pat, debug
		print "replacing " + trans_tuple[0]
		text = re.sub(trans_tuple[0], trans_tuple[1], text)
	
	print "done"	


translate1 = [ 
	( '<!--[^<!--]*-->'			, r'' ),
	( '&rarr;'                              , r'\\rightarrow' ),
	( '-->'                                 , r'\\longrightarrow' ),
# pat: => could come in the document
#	( '=>'                                  , r'\\Rightarrow' ),
	( '==>'                                 , r'\\Longrightarrow' ),
	( '<--'                                 , "\\longleftarrow" ),
	( '<-'                                  , "\\leftarrow" ),
	( '<=='                                 , "\\Longleftarrow" ),
# pat: <= could come in the document (smaller and equal)
#	( '<='                                  , "\\Leftarrow" ),
	( "(?s)<!--.*?-->"		, '' ),
	( '\[\[[a-z]{2,6}(?:-..)?:.*?\]\]' , '' ),	# delete links to other languages
	( '{{.*?}}'			, '' ),		# delete {{VARIABLES}} and {{Templates}}
	( '__[A-Z]+__'			, '' ),
	#JM : due to the modification on the words with an '_'
	( '\_\_[A-Z]+\_\_'			, '' ),
#	( '(?m)^ (.*?)$'		, pre_formatted ),
	( '\n----+'			, "\\\\vspace{2mm}\n\\hline\n" ),
	( '<hr>'			, "\\\\vspace{2mm}\n\\hline\n" ),
	( '&'				, r'\&' ),
#	( '\^'      			, r'\^{}' ),
	( 'tableand'                    , r'&' ),	
	( "\\$"				, r'\$' ),
#	( 'latexmath'			, r'$' ),
	( '(?s)<code>(.*?)</code>'	, r'\\verb| \1 |' ),
	( '(?s)<nowiki>(.*?)</nowiki>'	, r'\\verb| \1 |' ),
	( '§'				, r'\\S'),
	( '(?s)<pre>(.*?)</pre>'	, r'\\fbox{\parbox{\pagewidth}{\1}}' ),
	( '(?s)<blockquote>(.*?)</blockquote>'	, r'\\begin{quotation}\emph{\1}\end{quotation}' ),
	( '(?s)<ref>(.*?)</ref>'	, r'\\begin{quotation}\1\end{quotation}' ),
	( '(?s)<includeonly>(.*?)</includeonly>',r'' ),
	( '(?s)<noinclude>(.*?)</noinclude>',r' ' ),
	( '<br.*?>'			, r'\\newline{}' ), # \\ doesn't work inside tables
#	( '^'				, '^' ),
	( '</?div.*>'			, '' ),
	( "''' *(.+?) *'''"		, r'\\textbf{\1}' ),
	( "'' *(.+?) *''"		, r'\\textit{\1}' ),
	( "(?m)^====+ *(.+?) *====+"	, r'\\subsubsection{\1}' ),
	( "(?m)^=== *(.+?) *==="	, r'\\subsubsection{\1}' ),
	( "(?m)^== *(.+?) *=="		, r'\\subsection{\1}' ),
	( "(?m)^= *(.+?) *="		, r'\\section{\1}' ),
	( "\"(.*?)\""			, config_begindoublequote[ code ] + r'\1' + config_enddoublequote[ code ] ),
	( r'(?<!\[)(http://.+?)(?=[ $\n\)])'	, ExternalURL2 ),
	( "\\[(http://|ftp://|mailto:)(.+?)(?: +([^\\]]+))?\\]" , ExternalURL ),
	( '(?s)<sub>(.*?)</sub>'	, r'$_{\\textrm{\\scriptsize \1}}$' ),
	( '(?s)<sup>(.*?)</sup>'	, r'$^{\\textrm{\\scriptsize \1}}$' ),
	( '(?s)<center>(.*?)</center>'	, r'{\\centering \1 \\\\}' ),
	( '(?s)<s>(.*?)</s>'  		, r'{\\sout{\1}' ),
	( '(?s)<u>(.*?)</u>'            , r'{\\uline{\1}' ),
	( '(?s)<tt>(.*?)</tt>'          , r'{\\texttt{\1}' ),
	( '(?s)<small>(.*?)</small>'    , r'{\\small{\1}' ),
	( '~'				, r'{\\textasciitilde}' ),
	( r'%'				, r'\%' ),
	( "\[\[([^\|]+?)\]\]"		, WikiURL1 ),
	( "\[\[([^\|]+?)\|([^\|]+?)\]\]", WikiURL2 ),
]
so und hier würde es doch trotzdem alles was zwischen <special> steht übersetzten, oder
!? da es das ja im moment auch bei math macht, oder nicht?
 

mondschein85

Mitglied
Achso das führt dazu das auch ^, _ mit beachtet werden!? Weil _ ja eigentlich nicht oder? Die sind ja in URLs erlaubt

:( Och menno hatte schon Hoffnung

Bin gerade auch am überlegen, in wieweit:

DoWiki(text)

if text=re.sub(r'(?s)\n:+ *<math>(.*?)</math>\s*?([\.,;]?)\n', text)
do translate1()
else
do translate2()

gibt es eine Methode die true zurück gibt, wenn text=re.sub(r'(?s)\n:+ *<math>(.*?)</math>\s*?([\.,;]?)\n', text) einen Wert zurückgibt?