Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Dat klopt iid. Dat moet ook zo van mij.PencakSilat schreef op woensdag 09 maart 2005 @ 16:33:
Je kijkt alleen naar het domein, en niet wat er voor het apenstaartje staat.
Hij pakt als het goed is nu alles wat achter de : van <a href="mailto: komt en voor de @ komt.
Maar wat wil je er verder mee zeggen
Nu zou hij ook bijv:
435346hrthrthrwthrth4534636thtrmhnrtw@hoi.com pakken bijv. Maar dat is niet erg
Waar ik mee zit is dat nu mijn programma NIKS aan output geeft.
Ik probeer dit dus uit te lezen: http://ezeeman.demon.nl/files/mailtest.html
[ Voor 29% gewijzigd door DeMoN op 09-03-2005 16:48 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
[ Voor 4% gewijzigd door DeMoN op 13-03-2005 18:40 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Verwijderd
1
2
3
4
5
| >>> import re >>> p = re.compile(r"<a.+?href\=\"mailto\:(.*?)\".*?>") >>> m = p.match('<a href="mailto:testmail@test.nl">test account e-mail</a>') >>> m.group(1) 'testmail@test.nl' |
De regex is dus <a.+?href\=\"mailto\:(.*?)\".*?>, en je gebruikt hem als raw string. Als je dat wil, kan je nog kijken of er na mailto: wel iets staat wat een e-mail adres zou kunnen zijn.
Ik kan het niet helemaal overzien, maar ik denk inderdaad dat je vergeten bent een "stop" aan je regex toe te voegen.
Hm ok danVerwijderd schreef op zondag 13 maart 2005 @ 18:58:
Ik heb ff voor je geknutseld en ik kom tot het volgende:
Python:
1 2 3 4 5 >>> import re >>> p = re.compile(r"<a.+?href\=\"mailto\:(.*?)\".*?>") >>> m = p.match('<a href="mailto:testmail@test.nl">test account e-mail</a>') >>> m.group(1) 'testmail@test.nl'
De regex is dus <a.+?href\=\"mailto\:(.*?)\".*?>, en je gebruikt hem als raw string. Als je dat wil, kan je nog kijken of er na mailto: wel iets staat wat een e-mail adres zou kunnen zijn.
Ik kan het niet helemaal overzien, maar ik denk inderdaad dat je vergeten bent een "stop" aan je regex toe te voegen.
Bedankt..
Ik zie ook meteen dat jij heel anders met die regexpjes in Python omgaat. Ik doe het een stuk simpeler. group() heb ik bijv. nooit gebruikt..
Hier een stukje code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| def ScanSiteSourceForAddresses(sitesourcescan_l): global re #maak een string van de site source sourcetoscan = str(sitesourcescan_l) #wat moet er gefilterd worden? flikker dat in een list regexpList = (re.compile("HIEREENREGEXPNAARWENS"),re.compile("HIERNOGEENTJE"),re.compile("ENZ..")) #define alvast addresslist addresslist = "" #scan elke line van sourcetoscan per block.. for line in sourcetoscan.split(): #check of een block matched met een regexp in de regexplist for re in regexpList: match = re.match(line) #voeg de matchende line toe als het een match is if match: addresslist = addresslist + line + "\n" #return de hele addressList... misschien handig voor 'future use' print "Done." return addresslist |
Maar ik klooi wel even verder. Zal nog even wat beter kijken naar hoe je effectiever met regexps kan omgaan in Python.
Tips zijn altijd welkom natuurlijk, ik programmeer nog niet zo lang
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Verwijderd
http://diveintopython.org/regular_expressions/index.html
succes
Nog bedankt!Verwijderd schreef op maandag 14 maart 2005 @ 09:57:
Hier is een goede tutorial over Python en regular expressions.
http://diveintopython.org/regular_expressions/index.html
succes
Dit ga ik zeker 'bestuderen'
[ Voor 3% gewijzigd door DeMoN op 14-03-2005 13:23 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Paar dingetjes:DeMoN schreef op zondag 13 maart 2005 @ 20:39:
[...]
Hm ok dan
Bedankt..
Ik zie ook meteen dat jij heel anders met die regexpjes in Python omgaat. Ik doe het een stuk simpeler. group() heb ik bijv. nooit gebruikt..
Hier een stukje code:
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def ScanSiteSourceForAddresses(sitesourcescan_l): global re #maak een string van de site source sourcetoscan = str(sitesourcescan_l) #wat moet er gefilterd worden? flikker dat in een list regexpList = (re.compile("HIEREENREGEXPNAARWENS"),re.compile("HIERNOGEENTJE"),re.compile("ENZ..")) #define alvast addresslist addresslist = "" #scan elke line van sourcetoscan per block.. for line in sourcetoscan.split(): #check of een block matched met een regexp in de regexplist for re in regexpList: match = re.match(line) #voeg de matchende line toe als het een match is if match: addresslist = addresslist + line + "\n" #return de hele addressList... misschien handig voor 'future use' print "Done." return addresslist
Maar ik klooi wel even verder. Zal nog even wat beter kijken naar hoe je effectiever met regexps kan omgaan in Python.
Tips zijn altijd welkom natuurlijk, ik programmeer nog niet zo lang
- 'global re' zou je niet moeten gebruiken. Python zoekt automatisch in de global scope als een variabele niet in de local scope gevonden kan worden (simpel gezegd). Alleen als je een globale variable wil wijzigen is het nodig om 'global' te gebruiken. Je doet dat hier ('re in regexpList'), maar het is een beter idee om de 're' module niet te overriden, om verwarring te voorkomen. Verander 're in regexpList' dus bijv. in 'regexp in regexpList'.
- Waarom 'str' over je source? Wat pass je eigenlijk aan deze functie?
- Waarom zoek je regel voor regel? Kijk eens naar re.findall().
- Als je regel voor regel blijft zoeken; matches kun je het beste bij houden door middel van een list: 'addresslist = ""' -> 'addresslist = []' en 'addresslist = addresslist + line + "\n"' -> 'addresslist.append(line)'. En dan aan het einde "\n".join(addresslist). String concatenation is redelijk langzaam in Python. Overigens zou ik zelf gewoon een list teruggeven en dan de callende functie iets er mee laten doen.
Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet
Zeer goede tipsJohannes schreef op maandag 14 maart 2005 @ 17:16:
[...]
Paar dingetjes:
- 'global re' zou je niet moeten gebruiken. Python zoekt automatisch in de global scope als een variabele niet in de local scope gevonden kan worden (simpel gezegd). Alleen als je een globale variable wil wijzigen is het nodig om 'global' te gebruiken. Je doet dat hier ('re in regexpList'), maar het is een beter idee om de 're' module niet te overriden, om verwarring te voorkomen. Verander 're in regexpList' dus bijv. in 'regexp in regexpList'.
- Waarom 'str' over je source? Wat pass je eigenlijk aan deze functie?
- Waarom zoek je regel voor regel? Kijk eens naar re.findall().
- Als je regel voor regel blijft zoeken; matches kun je het beste bij houden door middel van een list: 'addresslist = ""' -> 'addresslist = []' en 'addresslist = addresslist + line + "\n"' -> 'addresslist.append(line)'. En dan aan het einde "\n".join(addresslist). String concatenation is redelijk langzaam in Python. Overigens zou ik zelf gewoon een list teruggeven en dan de callende functie iets er mee laten doen.
Ik gooi mijn programma binnenkort ff om
btw.. die global re (je eerste puntje) die moest ik wel gebruiken omdat hij anders heel re niet herkende terwijl hij wel in de import zit
Ik heb btw die 'str' over de source gewoon weggelaten nu. Had de indruk dat dat nodig was om die source uit te kunnen lezen
Ik ben alweer wat verder... nogmaals thx
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Maar hij wil nog steeds die mailto links niet pakken... heeft dit dus gewoon te maken doordat ik perse group() moet gebruiken?
Ik denk niet dat dat gaat lukken om te doen omdat ik een functie heb waar een regexplist wordt toegekend.
Zelfs als ik de hele mailto source tag in een rawstr zet vind ie em niet!
Wat ie dus wel zou moeten vinden want het staat gewoon hierin:
http://ezeeman.demon.nl/files/mailtest.html
1
2
3
4
5
6
| def RegExps(): rawstr = """<a href="mailto:testmail@test.nl">test account e-mail</a>""" regexplist = (re.compile("^.+(@)[a-zA-Z0-9]+(.)[a-zA-Z0-9]{2,4}$"), #voor normale adressen re.compile("^.+\\@(\\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)(,?)(;?)$"), #voor normale adressen re.compile(r"<a.+?href=\"mailto:(.*?)\".*?>"), #ook voor mailto adressen (werkt ook niet) re.compile(rawstr)) #checkt voor de test op de hele mailto tag maar werkt ook niet! |
Hoe wil ik dit nou ooit nog voor elkaar krijgen
Die normale adressen werken perfect.. (adres1@domein.nl etc..)
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Verwijderd
Ik heb em gewoon helemaal toegevoegd.. en ook dan wil hij hem niet pakken.Verwijderd schreef op woensdag 16 maart 2005 @ 18:52:
Ehm, waarom staat die laatste regel in je code? <a href="mailto:testmail@test.nl">test account e-mail</a> is volgens mij geen regexp (strict natuurlijk wel, maar het is compleet zinloos). Wat doe je vervolgens met regexplist? Hij werkt namelijk ècht!
Puur voor de test dus en om bijv. jou te laten zien dat het nu nog niet werkt
Heel simpel gezegd ben ik er nu achter wat mijn probleem is.
Mailadressen die als volgt in een source van een html page staan zijn geen probleem:
1
| yadayadayadayadayadayada mail@adres.nl yadayadayadayadayadayada |
Staat het echter ook alleen maar zo:
1
| yadayadayadayadayadayada<br>mail@adres.nl<br>yadayadayadayadayad |
Werkt het niet meer.
M.a.w. hij kan geen mailadressen filteren die aan een tekst vast zitten gekoppeld. Daarom krijgt hij ook <a href="mailto:mail@adres.nl">click4mail</a> niet te pakken.
Waarom dit is, weet ik niet en is eigenlijk de hoofdvraag van dit topic.. want zoals je kan zien op de img uit mijn startpost (deze) is mijn regexp wel goed zeg maar
Anders wil ik ook wel ff mijn code posten op verzoek
[ Voor 12% gewijzigd door DeMoN op 16-03-2005 19:45 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Verwijderd
Heel graagDeMoN schreef op woensdag 16 maart 2005 @ 19:43:
[...]
Anders wil ik ook wel ff mijn code posten op verzoek
Hou in gedachten dat dit een van mijn eerste programma's is
Als je hem runned zal je er btw achter komen dat veel dingen ff niet werken als het moet. Zoals dat je een URL kan ingeven om te scannen e.d. Dat heb ik tijdelijk ff hardcoded gezet omdat dit sneller testen is
Als je de code gaat bekijken kan je het beter ff in een goede IDE pasten want zo te zien heeft GoT nog geen syntaxhighlighting voor Python en er zit nogal wat commentaar in wat op deze manier wel irritant kan zijn
edit: CODE FF WEG.. CHECK 2 POSTS HIERONDER DAAR STAAT HET DUIDELJKER
al die regexps bij elkaar ziet er wel als een zooi uit maar ook wel weer tof..
[ Voor 110% gewijzigd door DeMoN op 18-03-2005 09:46 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Dat kwam dus doordat je ook een lokale variable had die je 're' had genoemd. Je kreeg waarschijnlijk een UnboundLocalError: local variable 're' referenced before assignment. Nu je 're' hebt hernoemd is 'global re' ook niet meer nodig.DeMoN schreef op maandag 14 maart 2005 @ 17:27:
[...]
Zeer goede tips
Ik gooi mijn programma binnenkort ff om
btw.. die global re (je eerste puntje) die moest ik wel gebruiken omdat hij anders heel re niet herkende terwijl hij wel in de import zit
In de regexps die je gebruikt om dit soort adressen te matchen ('<a.+?href=\"mailto:(.*?)\".*?>' en '(?<=<a href=\"mailto:).+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,4}') is er geen wildcard (.* ervoor, bijvoorbeeld) gedefinieerd voordat je bij de <a href aankomt. Deze matchen (zie ook http://docs.python.org/lib/matching-searching.html) dus sowieso niet als er überhaupt iets voor de <a href staat. Nou heb ik niet getest of ze dan wel werken, maar re.search() of re.findall() gebruiken zal je in ieder geval weer een stukje dichter bij brengen.DeMoN schreef op woensdag 16 maart 2005 @ 19:43:
[...]
M.a.w. hij kan geen mailadressen filteren die aan een tekst vast zitten gekoppeld. Daarom krijgt hij ook <a href="mailto:mail@adres.nl">click4mail</a> niet te pakken.
Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet
JupJohannes schreef op vrijdag 18 maart 2005 @ 00:08:
[...]
Dat kwam dus doordat je ook een lokale variable had die je 're' had genoemd. Je kreeg waarschijnlijk een UnboundLocalError: local variable 're' referenced before assignment. Nu je 're' hebt hernoemd is 'global re' ook niet meer nodig.
In de regexps die je gebruikt om dit soort adressen te matchen ('<a.+?href=\"mailto:(.*?)\".*?>' en '(?<=<a href=\"mailto:).+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,4}') is er geen wildcard (.* ervoor, bijvoorbeeld) gedefinieerd voordat je bij de <a href aankomt. Deze matchen (zie ook http://docs.python.org/lib/matching-searching.html) dus sowieso niet als er überhaupt iets voor de <a href staat. Nou heb ik niet getest of ze dan wel werken, maar re.search() of re.findall() gebruiken zal je in ieder geval weer een stukje dichter bij brengen.[/quote]
Aha
Btw, heb hier een minicode ff snel gemaakt.. kan je goed zien wat er nu niet werkt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import re siteurl = "http://ezeeman.demon.nl/files/mailtest.html" source = urllib.urlopen(siteurl).read() regexplist = (re.compile("adres1@domein.nl"), re.compile(r"<a href=\"mailto:testmail@test.nl\">test account e-mail</a>")) addresslist = [] for line in source.split(): for regexp in regexplist: match = regexp.match(line) if match: addresslist.append(line) "\n".join(addresslist) print addresslist |
output:
1
2
| >>> ['adres1@domein.nl'] |
Nu zie je dat 'adres1@domein.nl' gewoon op die site staat, los van andere chars en zo en die matched ook gewoon. Ik heb hier expres ff geen regexps gebruikt alleen voor het voorbeeld en om te laten zien dat hij gewoon matched.
Maar nu zie je ook dat '<a href="mailto:testmail@test.nl">test account e-mail</a>' gewoon los terug te vinden is op de site en ook die probeer ik hier te matchen dmv hem gewoon op de regexp zelf te laten zoeken.
In feite niks anders dan die adres1@domein.nl alleen werkt die mailto dan weer niet
Ik heb met .* gespeeld, maar dat wil ook niet werken.
En aangezien ik een regexplist heb zou ik niet weten hoe ik dit kan combineren met een re.findall() of een re.search() .. dat gaat afaik zoals ik lees op internet wel perfect als je hem met één regexp wil laten matchen maar ik gebruik natuurlijk een hele regexplist zoals je kan zien
Pff valt niet mee om uit te leggen
Maar iemand nog een opzetje voor mij? Ik ben er bijna
[ Voor 21% gewijzigd door DeMoN op 18-03-2005 09:54 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
Mensen, onwijs bedankt voor uw hulp!
Ik ben eruit. Zo moeilijk was het achteraf niet meer, ik vermeldde al dat ik er bijna was
Oplossing:
1
2
3
4
5
6
7
8
9
10
| import re
siteurl = "http://ezeeman.demon.nl/files/mailtest.html"
source = urllib.urlopen(siteurl).read()
regexplist = ('<a.+?href=\"mailto:(.*?)\".*?>', '[a-zA-Z0-9]+@[a-zA-Z0-9]+.\.[a-zA-Z]{2,4}')
for regexp in regexplist:
match = re.findall(regexp, source)
print match |
output
1
2
3
| >>> ['testmail@test.nl'] ['testmail@test.nl', 'dubbeladres@showmeonce.com', 'dubbeladres@showmeonce.com', 'adres1@domein.nl', 'adres2@domein.nl', 'adres3@domein.nl', 'adres10@domein.nl', 'adres11@domein.nl'] |
Dit nu dus ff netjes in mijn hoofdprogramma inbouwen (waar o.a. een doublefilter en de hele mikmak nog over de list heen wordt gehaald
Veel geleerd weer.
Zie je nog onvolkomenheden of heb je tips, mag je het posten... ik leer graag zo veel mogelijk
[ Voor 24% gewijzigd door DeMoN op 18-03-2005 12:22 ]
Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein
