python正則-字符串處理,主要用於處理請求參數格式爲application/x-www-form-urlencoded的表單數據

#當提交的表單數據格式爲application/x-www-form-urlencoded,直接從瀏覽器複製出來的格式是str_lin(chrome,也是最多見的)或者str_in2(火狐)這兩種格式
你會發現直接複製出來用python進行請求時不行的,因此須要對其進行處理,最終的格式key1=value1&key2=value2...這種格式
#下面是實現代碼,第三個方法是沒事的時候花了點時間幫開發寫的一個協助腳本,用於php調試請求

import re
#request_data_change_to_StrEncode
str_in='''customer_type: 1
            source: 1
            course_name_id: 3
            tel: 18883612485
            customer_name: 測試
            sex: 0
            school: ce'w's
            intro_id: 0
            keys[0]: 0
            transfer_time: 2019-04-03 17:32:39''' #谷歌瀏覽器請求參數格式
str_in2='''card_manage_id  5
        keys[0]  0
        study_card_name  孵化營9800
        price  9800.00
        number  9
        least_price  1.00
        org_id  3
        meth_id  2
        year  3
        month  0
        ticket[0][ticket_manage_id]  1
        ticket[0][ticket_num]  10
        period  36
        transfer_time  2019-04-03 17:32:39''' #火狐瀏覽器請求參數格式

str_in3='''customer_type:2
    source:1
    course_name_id:1
    tel:13500000136
    customer_name:測試-意向
    sex:1
    customer_card_afterfour:1234
    sc_code_id:2
    school:5555
    address[0]:140000
    address[1]:140100
    sc_ty_id:2
    student_number:2
    team_number:2
    turnover:2
    intro_id:1
    age_group:2S
    customer_card:500241199601020215
    is_fellow_study:2
    fellow_hr:223
    study_goal:2
    qq:2455
    wechat_number:wew
    email:225@qq.com
    school_area:222
    intrdu_id:312
    transfer_time:2019-04-03 17:32:39'''
str_in4='''member_finance_id[0]: 27803
        total_price: 59800
        state: 1
        finan_rmk: 543
        pay_fees_ascribed: 1'''
class request_data_change_to_str(object):
    def requestDataToStr_firefoxAndChrome(self,str_in):
        str_colon=re.search('[\W][\s]{1,1}|([\s]){1,1}|[\W]{1,1}',str_in).group() #匹配出字符串中全部的冒號
        str_equal=re.sub(str_colon,'=',str_in) #將字符串中的冒號替換爲等於號(: >>> =)
        str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal).group() #匹配出字符串中全部的換行符與空格,不寫表示不限定匹配次數
        str_give=re.sub(str_lin,'&',str_equal) #將字符串中的換行符替換爲& (\n >>> &)
        str_lin2=re.search('\s.*',str_give)
        if str_lin2 is not None:
            str_lin2=str_lin2.group()
            str_lin3=re.search('=',str_lin2)
            if str_lin3 is not None  and 'time' in str_give: #對請求參數含有時間字段進行特殊處理
                try:
                    str_lin3=str_lin3.group()
                    str_give2=re.sub(str_lin3,':',str_lin2)
                    str_give3=re.sub(str_lin2,str_give2,str_give)
                    print(str_give3)
                    return str_give3.encode() #返回字符串,並對數據進行編碼處理
                except Exception as error:
                    print(error)
                    # pass
            else:
                print(str_give)
                return str_give.encode()
        else:
            print(str_give)
            return str_give.encode()
            

    def requestDataToStr_firefoxAndChrome_teShu(self,str_in): #特殊處理
        str_colon=re.search('[^\S?]{2,}',str_in).group() #匹配出字符串中全部的冒號
        str_equal=re.sub(str_colon,'=',str_in) #將字符串中的冒號替換爲等於號(: >>> =)
        str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal).group() #匹配出字符串中全部的換行符與空格,不寫表示不限定匹配次數
        str_give=re.sub(str_lin,'&',str_equal) #將字符串中的換行符替換爲& (\n >>> &)
        print('---'+str_colon+'---')
        # print(str_equal)
        str_lin2=re.search('\s.*',str_give)
        # print(str_lin2)
        if str_lin2 is not None:
            str_lin2=str_lin2.group()
            str_lin3=re.search('=',str_lin2)
            print(str_lin3)
            if str_lin3 is not None  and 'time' in str_give: #對請求參數含有時間字段進行特殊處理
                try:
                    str_lin3=str_lin3.group()
                    str_give2=re.sub(str_lin3,':',str_lin2)
                    str_give3=re.sub(str_lin2,str_give2,str_give)
                    print(str_give3)
                    return str_give3.encode() #返回字符串,並對數據進行編碼處理
                except Exception as error:
                    print(error)
                    # pass
            else:
                print(str_give)
                return str_give.encode()
        else:
            print(str_give)
            return str_give.encode()

    def requestDataToStr_firefoxAndChrome_teShu2(self,str_in): #特殊處理2
        str_colon=re.search(':\W?|\s*:\W?',str_in).group() #匹配出字符串中全部的冒號
        str_equal=re.sub(str_colon,'=',str_in) #將字符串中的冒號替換爲等於號(: >>> =)
        str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal).group() #匹配出字符串中全部的換行符與空格,不寫表示不限定匹配次數
        str_give=re.sub(str_lin,'&',str_equal) #將字符串中的換行符替換爲& (\n >>> &)
        # print('---'+str_colon+'---')
        # print(str_equal)
        str_lin2=re.search('\s.*',str_give)
        print(str_lin2)
        if str_lin2 is not None:
            str_lin2=str_lin2.group()
            str_lin3=re.search('=',str_lin2)
            print(str_lin3)
            if str_lin3 is not None  and 'time' in str_give: #對請求參數含有時間字段進行特殊處理
                try:
                    str_lin3=str_lin3.group()
                    str_give2=re.sub(str_lin3,':',str_lin2)
                    str_give3=re.sub(str_lin2,str_give2,str_give)
                    print(str_give3)
                    return str_give3.encode() #返回字符串,並對數據進行編碼處理
                except Exception as error:
                    print(error)
                    # pass
            else:
                # print(str_give)
                return str_give.encode()
        else:
            print(str_give)
            return str_give.encode()


    def requestDataTotr_custom(self,str_in,str_custom='=>'):
        str_colon=re.search('\s*:\W?',str_in).group() #匹配出字符串中全部的冒號
        str_tihuan='"'+str_custom+'"'
        str_equal=re.sub(str_colon,str_tihuan,str_in) #將字符串中的冒號替換爲目標符號即定義的str_custom的值
        str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal).group() #匹配出字符串中全部的換行符與空格,不寫表示不限定匹配次數
        str_give=re.sub(str_lin,'"'+str_lin+'"',str_equal) #將字符串中的換行符替換爲& (\n >>> &)
        str_lin2=re.search('^',str_give).group() #匹配字符串開頭
        str_give2=re.sub('^','"'+str_lin2,str_give) #替換結果爲'"'+匹配結果加
        str_lin3=re.search('$',str_give2).group() #匹配字符串末尾
        str_give3=re.sub('$',str_lin3+'"',str_give2)#替換結果爲匹配結果加+'"'
        # print('---'+str_colon+'---')
        # print(str_equal)
        # print(str_give2)
        # print(str_give3)
        return str_give.encode() #返回字符串,並對數據進行編碼處理


    def requestDataTostr_postman(self,str_in):
        str_colon=re.search('\s*:\W*',str_in).group() #匹配出字符串中全部的冒號
        str_tihuan=':'
        str_equal=re.sub(str_colon,str_tihuan,str_in) #將字符串中的冒號替換爲目標符號即定義的str_custom的值
        str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal).group() #匹配出字符串中全部的換行符與空格,不寫表示不限定匹配次數
        str_give=re.sub(str_lin,'\n',str_equal)
        print(str_give)

if __name__=="__main__":
    request_data_to_str=request_data_change_to_str()
    request_data_to_str.requestDataToStr_firefoxAndChrome(str_in3)
    # request_data_to_str.requestDataToStr_firefoxAndChrome_teShu(str_in2)
    # request_data_to_str.requestDataTotr_custom(str_in4)
    # request_data_to_str.requestDataTostr_postman(str_in3)
輸出:

str_in 方法1 requestDataToStr_firefoxAndChrome

>>>>> 

customer_type=>1&source=>1&course_name_id=>3&tel=>18883612485&customer_name=>測試&sex=>0&school=>ce'w's&intro_id=>2340

str_in方法2 requestDataToStr_firefoxAndChrome_teShu2

>>>
customer_type=>1&source=>1&course_name_id=>3&tel=>18883612485&customer_name=>測試&sex=>0&school=>ce'w's&intro_id=>2340

str_in方法3 requestDataTotr_custom

>>>>

"customer_type"=>"1"
"source"=>"1"
"course_name_id"=>"3"
"tel"=>"18883612485"
"customer_name"=>"測試"
"sex"=>"0"
"school"=>"ce'w's"
"intro_id"=>"2340"

#優化對時間的處理php

相關文章
相關標籤/搜索