2017-01-24 7 views
-1

私の知識は非常に限られていますが、私は最善を尽くしています。複数の文字列に分割する

複数の文字列、変数で文字列を分割したいと考えています。

は今、私はhttpサーバのスクリプトを使用し、おかげ:私はちょうど少し変更したhttps://gist.github.com/bradmontgomery/2219997

は、私は、POST文字列のデコードを受け、私は別の文字列や変数にその文字列を分割したいです。

これは完全なコードです:

http://pastebin.com/nkbkD2iZ

#!/usr/bin/env python 
""" 
Very simple HTTP server in python. 
Usage:: 
    ./dummy-web-server.py [<port>] 
Send a GET request:: 
    curl http://localhost 
Send a HEAD request:: 
    curl -I http://localhost 
Send a POST request:: 
    curl -d "foo=bar&bin=baz" http://localhost 
""" 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import SocketServer 
import sys 
import time 
import csv 
import urllib 
import psycopg2 


con = None 

class S(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     self._set_headers() 
     self.wfile.write("<html><body><h1>hi!</h1></body></html>") 

    def do_HEAD(self): 
     self._set_headers() 

    def do_POST(self): 
    # Doesn't do anything with posted data 
     content_length = int(self.headers['Content-Length']) # <--- Gets the size of data 
     post_data = self.rfile.read(content_length) # <--- Gets the data itself 
     print post_data # <-- Print post data 
     self._set_headers() 
     dataEncoded = str(post_data) 
     dataString = urllib.unquote(post_data) 
     timeString = str(time.strftime("%d %m %Y %H:%M:%S")) 
     with open("decoded_log.csv",'a') as resultFile: 
      wr = csv.writer(resultFile, dialect='excel') 
      wr.writerow([dataString,timeString]) 
     with open("encoded_log.csv",'a') as resultFile: 
      wr = csv.writer(resultFile, dialect='excel') 
      wr.writerow([dataEncoded,timeString])  
     con = psycopg2.connect("host=localhost dbname=data_log user=USER password=PASSWORD") 
     print "DB Connection successful." 
     cur = con.cursor() 
     cur.execute("INSERT INTO log(data,date_time) VALUES (%s, %s)",(dataString,timeString)) 
     con.commit()   

def run(server_class=HTTPServer, handler_class=S, port=5400): 
    server_address = ('', port) 
    httpd = server_class(server_address, handler_class) 
    print 'Starting httpd...' 
    httpd.serve_forever() 

if __name__ == "__main__": 
    from sys import argv 

    if len(argv) == 2: 
     run(port=int(argv[1])) 
    else: 
     run() 

sys.exit() 
が、私はこの文字列を受け取る:

%22%22%22%5B001%5D%22%22%3A%22%22C3643%22%22%2C%22%22%7C%5B002%5D%22%22%3A%22%2232303138%22%22%2C%22%22%7C%22%22%3D%22=

デコードです:だから

""""C3643""""32303138"",""|""="=

、どのようなI欲しい、私はハこれを行うに失敗しまし、C3643および32303138を抽出することである、そして私がで32303138を分割するようになる:だから

a = C3643 b = 32 c = 303 d = 138

:私はこの文字列を持っていると思いますので、一度、すべての行われている

32 303 138

、私はPostgreSQLの各値、各値に挿入することができます。

ありがとうございます!

答えて

0

正規表現と単語を抽出して、そのような文字列をスライス:

import re 

s1 = """\"\"\"\"C3643\"\"\"\"32303138\"\",\"\"|\"\"=\"=""" 
print s1 

s2 = re.findall(r'\w+', s1) 
print s2 

a = s2[0] 
s3 = s2[1] 

b,c,d = s3[:2], s3[2:5], s3[5:] 
print a 
print b 
print c 
print d 

出力:これらの私たちのために

""""C3643""""32303138"",""|""="= 
['C3643', '32303138'] 
C3643 
32 
303 
138 
+0

感謝をMYGz!私が言及しなかったことの一つは、その文字列です。 S1 = ""」 "" "" C3643 "" "" 32303138 ""、 "" | "" = "= """ 最初の番号C3643は、このケースをINS可変長を持っ​​ていますが、意志最初の "" "" "" "" "内にあり、この場合の2番目の番号32303138では、これは同じ長さになります。最初の数字は完全に取ります。次の数字はそれをより多くの数に分割します。 – Bannedillo

+0

これらの '' 'をエスケープする必要があります。悪いことに、幸運にも偶数個の' ''があったので、連鎖しています。 – MYGz

+0

私に1秒を与える。私はそれを是正します – MYGz

0

あなたが正規表現不可解を見つける:

>>> post="%22%22%22%5B001%5D%22%22%3A%22%22C3643%22%22%2C%22%22%7C%5B002%5D%22%22%3A%22%2232303138%22%22%2C%22%22%7C%22%22%3D%22=" 
>>> result= urllib.unquote(post).replace('"',"").split(',') 
>>> a = result[0].split(':')[1] 
>>> b = result[1].split(':')[1][:2] 
>>> c = result[1].split(':')[1][2:5] 
>>> d = result[1].split(':')[1][5:] 
>>> a,b,c,d 
('C3643', '32', '303', '138') 
>>> a 
'C3643' 
>>> b 
'32' 
>>> c 
'303' 
>>> d 
'138' 
+0

助けてくれてありがとうが、それは私にこのエラーを与えている、 モデル= dataString [1]。 index:範囲外のリストインデックス たとえば、このポストでは:%22%2200%3A0a9%3A59d6816%22%22%22%2232303138%22%22 – Bannedillo

+0

おそらく、その文字列が '' "00:0a9:59d6816" "" "32303138" "としてデコードし、元々投稿した形式に従わないためです。もし '' len(result)<2:print "のデータエラー" –

関連する問題