[python] reguläre ausdrücke

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?