Python, regex problem

Python, regex problem

Innleggav TO » søn 21.03.2010 19:05

Kan noen kaste lys over hvorfor Python kastes ut i en uendelig løkke og hvordan det kan unngås?
Kode: Merk alt
import re
# denne matsjer OK
line1='MATERIALSTRENGTH    steel     6.    12.     0.5    1.0      670.        800. '
if re.search('MATERIALSTRENGTH[ \t]+[_a-zA-Z]+([0-9.]+|[ \t]+)+$', line1)!=None: print "Matsj"

# men her stopper Python aldri, eneste endring er bokstav i siste "tallet"
line2='MATERIALSTRENGTH    steel     6.    12.     0.5    1.0      670.        80b. ' 
if re.search('MATERIALSTRENGTH[ \t]+[_a-zA-Z]+([0-9.]+|[ \t]+)+$', line2)!=None: print "Matsj"
medlem i 212 måneder
 

Re: Python, regex problem

Innleggav ak » søn 21.03.2010 19:19

Så snart regexen har kommet seg forbi "steel" så er det kun
Kode: Merk alt
([0-9.]+|[ \t]+)+

som blir brukt til matching. Og hverken
Kode: Merk alt
[0-9.]
ELLER
Kode: Merk alt
[ \t]
takler en 'b'.

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: Python, regex problem

Innleggav TO » søn 21.03.2010 19:28

Jeg vet at det ikke matsjer (jeg skrev dette for å sjekke om inndata var gode.
Bør ikke Python avslutte søket når det ikke matsjer?
EDIT:
Har sjekket litt og det ser ut som om det finnes to typer regex-maskiner, NFA og DFA. Den som er i Python (og Perl m.fl.) er NFA (ikke deterministisk). Den jeg kjenner best er DFA, slik som som implementert i GNU awk og grep.. NFA-algoritmen kan ta voldsomt med tid dersom aktuell regex er patologisk, se f.eks. http://swtch.com/~rsc/regexp/regexp1.html .
Sist endret av TO den søn 21.03.2010 20:17, endret 1 gang
medlem i 212 måneder
 

Re: Python, regex problem

Innleggav ak » søn 21.03.2010 20:15

Ok, det fremgikk ikke klart av problembeskrivelsen din. Problemet er at du skaper rekursjon med syntaxen (a+|b+)+

Fjerner du de innerste plussene så går det nok bedre , altså (a|b)+ = ([0-9\.]|[ \t])+

Merk at jeg også har byttet ut . med \.

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: Python, regex problem

Innleggav TO » søn 21.03.2010 20:30

Tusen takk for løsningen.
Så forøvrig på http://docs.python.org/dev/howto/regex.html , under tittelen "Matching Characters" at alle metakarakterer, inkluder . , mister spesialbetydningen i karakterklasser. Sitat: Metacharacters are not active inside classes.

Forenklet deretter videre til: [ \t0-9.E+-]+
medlem i 212 måneder
 


Returner til Python



Hvem er i Forumene

Registrerte brukere: Ingen registrerte brukere



cron