Discussion:
Stringreplace i python?
(for gammel til at besvare)
Kasper Lund
2008-07-15 18:37:33 UTC
Permalink
Hej med jer.

Jeg har følgende funktion jeg skal have hjælp med:

def sendsms():
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Denne har jeg selv lavet, men det
virker ikke.
url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%r" \
% (HOST, PORT, USERNAME, PASSWORD, to, text)
f = urllib.urlopen(url)
print f.read()
f.close()

Som i kan se har jeg selv fosøgt mig med en replace funktion som jeg har
googlet mig frem til.

Problemet er at jeg har en url med en variabel %r som er text nede i
parantesen. Denne variabel indeholder noget tekst der skal sendes via
sms og min sms gateway vil have plusser (+) istedet for mellemrum.

Jeg skal derfor have byttet mellemrum ud med plusser.

Hvordan gøres dette? Det jeg har forsøgt ovenover virker ikke (men er
det overhovedet rigtigt at gøre det på text?)

Håber i kan hjælpe.

Mvh.

Kasper
Adam Sjøgren
2008-07-15 19:34:15 UTC
Permalink
Post by Kasper Lund
text = text.replace(" ","+") //Denne har jeg selv lavet, men
det virker ikke.
[...]
Post by Kasper Lund
Hvordan gøres dette? Det jeg har forsøgt ovenover virker ikke (men er
det overhovedet rigtigt at gøre det på text?)
Hvad sker der? "Det virker ikke" er ret vagt.
Post by Kasper Lund
text="en test, tak"
text.replace(" ", "+")
'en+test,+tak'
Udskiftningen ser ud til at virke som ønsket?


Mvh.
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Kasper Lund
2008-07-16 04:34:27 UTC
Permalink
Post by Adam Sjøgren
Post by Kasper Lund
text = text.replace(" ","+") //Denne har jeg selv lavet, men
det virker ikke.
[...]
Post by Kasper Lund
Hvordan gøres dette? Det jeg har forsøgt ovenover virker ikke (men er
det overhovedet rigtigt at gøre det på text?)
Hvad sker der? "Det virker ikke" er ret vagt.
Mellemrummene bliver ikke skiftet ud med plusser, og jeg får kun det
første ord med i min sms.
Brian Elmegaard
2008-07-16 07:24:06 UTC
Permalink
Post by Kasper Lund
Mellemrummene bliver ikke skiftet ud med plusser, og jeg får kun det
første ord med i min sms.
Det er nok nemmere at svare hvis du giver et komplet, men minimalt, eksempel.
--
Brian (remove the sport for mail)
http://www.et.web.mek.dtu.dk/Staff/be/be.html
http://www.rugbyklubben-speed.dk
Kasper Lund
2008-07-16 08:10:06 UTC
Permalink
Post by Brian Elmegaard
Det er nok nemmere at svare hvis du giver et komplet, men minimalt, eksempel.
Jeg prøver. Mit overvågningsprogram sættes til at køre denne kommando
når der opstår en fejl.

/usr/bin/curl -s
http://10.64.48.154:13013/cgi-bin/sendsms\?username=username\ /
&password=password\&to=$CONTACTPAGER$\&text=$NOTIFICATIONTYPE$: /
+$HOSTALIAS$/$SERVICEDESC$+is+$SERVICESTATE$

Det kommer til at se ca. sådan her ud, alt efter hvilken fejl det er og
på hvilken maskine:

/usr/bin/curl -s
http://10.64.48.154:13013/cgi-bin/sendsms\?username=username\ /
&password=password\&to=tlf_nummer\&text=PROBLEM:+SQL Server/ / Backup
Exec Remote Agent+is+CRITICAL

scriptet sendsms ser sådan her ud:

-----------------------------------------------------
#!/usr/bin/python

import os, string, sys, urllib

HOST = "localhost"
PORT = 13013
USERNAME = "tester"
PASSWORD = "foobar"

NUMBERS = "~/.sendsms.dat"

def is_a_phone_number(str):
if not str:
return 0
for c in str:
if not c in "0123456789+- ":
return 0
return 1

def recipient(arg):
if is_a_phone_number(arg):
return arg
f = open(os.path.expanduser(NUMBERS), "r")
arg = string.lower(arg)
number = None
for line in f.readlines():
parts = string.split(line)
if len(parts) == 2 and string.lower(parts[0]) == arg:
number = parts[1]
break
f.close()
if number:
return number
print "Unknown recipient", arg
sys.exit(1)

def sendsms():
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Skift mellemrum ud med plus.

url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%r" \
% (HOST, PORT, USERNAME, PASSWORD, to, text)
f = urllib.urlopen(url)
print f.read()
f.close()

if __name__ == "__main__":
sendsms()
--------------------------------------------------------

Jeg gik så ud fra at det var text variablen jeg skulle have fat i og
replace, men resultatet er det samme.

Måske i kan gennemskue det?

/Kasper
Klaus Alexander Seistrup
2008-07-16 10:31:05 UTC
Permalink
Post by Kasper Lund
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Skift mellemrum ud med plus.
Jeg forstår ikke helt hvorfor du både bruger urllib.quote_plus() og
bagefter ønsker at erstatte ' ' med '+'. .quote_plus() er defineret
som:

#v+
def quote_plus(s, safe = ''):
"""Quote the query fragment of a URL; replacing ' ' with '+'"""
if ' ' in s:
s = quote(s, safe + ' ')
return s.replace(' ', '+')
return quote(s, safe)
#v-

Dvs., at ' ' allerede burde være erstattet med '+' når strengen kommer
tilbage fra .quote_plus(). Har du prøvet at indsætte nogle prints her
og der for at se hvordan hvad ser ud hvornår?

Vil det gøre forskel at benytte .quote(), som erstatter ' ' med '%20'?

Alternativt, sæt en simpel streng sammen med '+' og drop .quote_plus(),
og se hvordan det virker. Fx

#v+
text = '+'.join(sys.argv[2:])
#v-

Så kan man altid putte flere krøller på senere.

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Adam Sjøgren
2008-07-16 10:42:15 UTC
Permalink
Post by Kasper Lund
/usr/bin/curl -s
http://10.64.48.154:13013/cgi-bin/sendsms\?username=username\ /
&password=password\&to=tlf_nummer\&text=PROBLEM:+SQL Server/ / Backup
Exec Remote Agent+is+CRITICAL
Så mellemrummene efter PROBLEM:+SQL og frem til Agent+ bliver ikke
udskiftet med plus-tegn?
Hvilke argumenter og data-filer skal man bruge for at genskabe dit
problem?

Det er lige før det er tid til at give dig dette link:
<http://www.chiark.greenend.org.uk/~sgtatham/bugs-da.html#showmehow>

[... script ...]

Jeg får en syntax-fejl når jeg prøver at køre dit script:

$ python /tmp/sms
File "/tmp/sms", line 40
text = text.replace(" ","+") //Skift mellemrum ud med plus.
^
SyntaxError: invalid syntax

Start med at poste den kode du rigtigt bruger.

Hvor kalder dit script 'curl'?
Post by Kasper Lund
Jeg gik så ud fra at det var text variablen jeg skulle have fat i og
replace, men resultatet er det samme.
Måske i kan gennemskue det?
Nu har du fortalt hvad det er der sker, som ikke burde ske. Så mangler
du bare at fortælle hvad du gør, for at få fejlen til at opstå.

Så har vi en chance.

Jo mere dem der skal hjælpe dig skal gætte på trivialiteter, jo længere
tid tager det for dem at komme med et fornuftigt bud.

Hvis jeg laver en fil ~/.sendsms.dat med indholdet:

test +4510101010

Og ændrer sendsms-funktionen til dette:

def sendsms():
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
# text = text.replace(" ","+") //Skift mellemrum ud med plus.
url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%r" \
% (HOST, PORT, USERNAME, PASSWORD, to, text)
print url
# f = urllib.urlopen(url)
# print f.read()
# f.close()

Og kalder programmet med:

$ python /tmp/sms test "PROBLEM: SQL Server / Backup Exec Remote Agent is CRITICAL"

så er uddata:

http://localhost:13013/cgi-bin/sendsms?username=tester&password=foobar&to=%2B4510101010&text='PROBLEM%3A+SQL+Server+%2F+Backup+Exec+Remote+Agent+is+CRITICAL'

Hvordan du får mellemrummene til ikke at blive til +'er, og hvordan du
får curl involveret er ikke til at læse ud af den kode du poster.

Er du sikker på det overhovedet er det script du sendte, du kører?


Mvh.

Adam
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Klaus Alexander Seistrup
2008-07-16 10:57:42 UTC
Permalink
Post by Adam Sjøgren
$ python /tmp/sms
File "/tmp/sms", line 40
text = text.replace(" ","+") //Skift mellemrum ud med plus.
^
SyntaxError: invalid syntax
Python bruger '#' som kommentartegn, hvorimod '//' er tegnet for
'floor division'.

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Adam Sjøgren
2008-07-16 11:05:27 UTC
Permalink
Post by Klaus Alexander Seistrup
Post by Kasper Lund
text = text.replace(" ","+") //Skift mellemrum ud med plus.
^
SyntaxError: invalid syntax
Python bruger '#' som kommentartegn, hvorimod '//' er tegnet for
'floor division'.
Så kan vi vist konkludere at Kasper ikke kører det script han (tror han
kører og) postede.


Mvh.
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Klaus Alexander Seistrup
2008-07-16 11:40:21 UTC
Permalink
Post by Adam Sjøgren
Post by Klaus Alexander Seistrup
Python bruger '#' som kommentartegn, hvorimod '//' er tegnet for
'floor division'.
Så kan vi vist konkludere at Kasper ikke kører det script han (tror
han kører og) postede.
Enig.

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Kasper Lund
2008-07-16 11:53:52 UTC
Permalink
Post by Adam Sjøgren
Post by Klaus Alexander Seistrup
Python bruger '#' som kommentartegn, hvorimod '//' er tegnet for
'floor division'.
Så kan vi vist konkludere at Kasper ikke kører det script han (tror
han kører og) postede.
Enig.
Det er korrekt at jeg har sat // ind for at understrege hvad det var jeg
havde lavet i forhold til det originale script - det er ikke noget jeg
har sat ind i scriptet.

Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan kan
jeg ellers gøre det?
Klaus Alexander Seistrup
2008-07-16 12:10:34 UTC
Permalink
Post by Kasper Lund
Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan
kan jeg ellers gøre det?
Med urllib (eller urllib2) eller tilsvarende?

#v+
#!/usr/bin/python

import sys
import urllib

fp = urllib.urlopen(sys.argv[1])
page = fp.read()
fp.close()
print page,
sys.exit(0)

# eof
#v-

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Niels L. Ellegaard
2008-07-16 12:36:14 UTC
Permalink
Post by Kasper Lund
Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan kan
jeg ellers gøre det?
Hvis du tager en kopi af dit program og fjerner en masse linier, så
tror jeg at det bliver lettere at give hjælp. Det følgende program er
utestet, men jeg håber at du fornemmer den generelle ide.

#!/usr/bin/python
import string, sys

text1 = string.join(sys.argv[2:], " ")
text2 = urllib.quote_plus(string.join(sys.argv[2:], " "))
text3 = text2.replace(" ","+")
text4 = text2.encode("utf-8").replace(" ","+")

print text1
print text2
print text3
print text4

Får du stadig fejlen hvis du kører ovenstående program (med det oprindelige input)?
Hvis ja, hvilket output får du?
Hvis nej, kan du rette programmet til så problemet opstår igen?

Niels
Kasper Lund
2008-07-16 12:43:36 UTC
Permalink
Post by Kasper Lund
Post by Adam Sjøgren
Post by Klaus Alexander Seistrup
Python bruger '#' som kommentartegn, hvorimod '//' er tegnet for
'floor division'.
Så kan vi vist konkludere at Kasper ikke kører det script han (tror
han kører og) postede.
Enig.
Det er korrekt at jeg har sat // ind for at understrege hvad det var jeg
havde lavet i forhold til det originale script - det er ikke noget jeg
har sat ind i scriptet.
Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan kan
jeg ellers gøre det?
Problemet er løst, jeg forsøge med lynx istedet for curl, og det virker.

Mange tak for hjælpen.
Adam Sjøgren
2008-07-16 13:11:54 UTC
Permalink
Post by Kasper Lund
Det er korrekt at jeg har sat // ind for at understrege hvad det var
jeg havde lavet i forhold til det originale script - det er ikke noget
jeg har sat ind i scriptet.
Ah, ok - jeg troede du sendte præcis det script du prøvede med (det er
en god idé at gøre, i øvrigt :-))
Post by Kasper Lund
Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan kan
jeg ellers gøre det?
Nu er jeg endnu mere forvirret - det script du postede henter da selv
url'en:

f = urllib.urlopen(url)
print f.read()
f.close()

?!

Hvordan kommer du fra scriptet til curl-kommandoen? Hvor har du den URL
som du bad curl om at hente fra?

Nå, men herligt at det fungerer nu :-)


Mvh.
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Kasper Lund
2008-07-16 16:24:31 UTC
Permalink
Post by Adam Sjøgren
Post by Kasper Lund
Det er korrekt at jeg har sat // ind for at understrege hvad det var
jeg havde lavet i forhold til det originale script - det er ikke noget
jeg har sat ind i scriptet.
Ah, ok - jeg troede du sendte præcis det script du prøvede med (det er
en god idé at gøre, i øvrigt :-))
Post by Kasper Lund
Curl bruger jeg fordi jeg skal "kalde" den genererede url. Hvordan kan
jeg ellers gøre det?
Nu er jeg endnu mere forvirret - det script du postede henter da selv
f = urllib.urlopen(url)
print f.read()
f.close()
?!
Hvordan kommer du fra scriptet til curl-kommandoen? Hvor har du den URL
som du bad curl om at hente fra?
Nå, men herligt at det fungerer nu :-)
Mvh.
Mit overvågningsprogram kan udføre en kommando når der opstår et problem.

Min SMS gateway kan sende sms'er baseret på en URL den modtager.

Jeg bruger derfor curl/lynx fra mit overvågningsprogram til at sende den
korrekte URL til sms gatewayen.
Adam Sjøgren
2008-07-16 16:54:02 UTC
Permalink
Post by Kasper Lund
Mit overvågningsprogram kan udføre en kommando når der opstår et problem.
Min SMS gateway kan sende sms'er baseret på en URL den modtager.
Jeg bruger derfor curl/lynx fra mit overvågningsprogram til at sende
den korrekte URL til sms gatewayen.
Hvor passer det script du postede ind henne?


Mvh.
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Kasper Lund
2008-07-17 19:39:49 UTC
Permalink
Post by Adam Sjøgren
Post by Kasper Lund
Mit overvågningsprogram kan udføre en kommando når der opstår et problem.
Min SMS gateway kan sende sms'er baseret på en URL den modtager.
Jeg bruger derfor curl/lynx fra mit overvågningsprogram til at sende
den korrekte URL til sms gatewayen.
Hvor passer det script du postede ind henne?
Det ligger på sms gatewayen og hedder sendsms. Det er det jeg "kalder"
med URL'en fra mit overvågningsprogram.

Michael Zedeler
2008-07-15 21:25:02 UTC
Permalink
Post by Kasper Lund
Hej med jer.
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Denne har jeg selv lavet, men det
Nu kender jeg ikke python særlig godt, men forskellen på dette og Adams
eksempel er tildelingen. Behøver du at skrive 'text = ' ovenfor? Skal
der ikke bare stå

text.replace(" ","+") //Denne har jeg selv lavet, men det

?

Mvh. Michael.
Adam Sjøgren
2008-07-15 21:36:02 UTC
Permalink
Post by Michael Zedeler
Nu kender jeg ikke python særlig godt, men forskellen på dette og
Adams eksempel er tildelingen. Behøver du at skrive 'text = ' ovenfor?
Skal der ikke bare stå
text.replace(" ","+") //Denne har jeg selv lavet, men det
?
Nej, du har fået vendt det på hovedet. Jeg tastede bare ind i Pythons
eval-loop tingeling ting - som så rapporterede hvad resultatet af
text.replace(" ", "+") blev.
Post by Michael Zedeler
text="en test, yep"
text=text.replace(" ", "+")
print text
en+test,+yep
Post by Michael Zedeler
other="to test, hep"
other.replace(" ", "+")
'to+test,+hep'
Post by Michael Zedeler
print other
to test, hep
(Mon i øvrigt ikke der findes et Python-bibliotek der klarer det og mere
til?)

Kasper bør beskrive hvad "virker ikke" betyder for ham i dette
tilfælde... så kan nogle Python-hajer (eller nogle af os
Python-ignoranter) sikkert hjælpe.


Mvh.

Adam
--
"Angels can fly because they take themselves lightly." Adam Sjøgren
***@koldfront.dk
Soren (News)
2008-07-16 08:52:50 UTC
Permalink
Kasper Lund <***@usenet.dk> writes:

[snip]
Post by Kasper Lund
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Denne har jeg selv lavet, men
urllib.quote_plus goer netop det du vil, du behoeves ikke selv lave
Post by Kasper Lund
import urllib
urllib.quote_plus('hej verden ;-)')
'hej+verden+%3B-%29'
Post by Kasper Lund
url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%r" \
% (HOST, PORT, USERNAME, PASSWORD, to, text)
Hvorfor vil du bruge %r ? Det er ikke det samme som at sende en tekst
Post by Kasper Lund
print 'test=%r' % urllib.quote_plus('hej verden ;-)')
test='hej+verden+%3B-%29'
Post by Kasper Lund
print 'test=%s' % urllib.quote_plus("'hej verden ;-)'")
test=%27hej+verden+%3B-%29%27


Mvh,
Soren
Kasper Lund
2008-07-16 09:53:24 UTC
Permalink
Post by Soren (News)
[snip]
Post by Kasper Lund
to = urllib.quote_plus(recipient(sys.argv[1]))
text = urllib.quote_plus(string.join(sys.argv[2:], " "))
text = text.replace(" ","+") //Denne har jeg selv lavet, men
urllib.quote_plus goer netop det du vil, du behoeves ikke selv lave
Men så kan jeg ikke forstå hvorfor den ikke sender hele teksten med, men
kun indtil det første mellemrum.
Loading...