day_5:string操作,namedtuple,正則表達(dá)式


string操作

字符串操作在實(shí)際解決問(wèn)題時(shí)經(jīng)常會(huì)遇到。

個(gè)人認(rèn)為的常用:

  1. str[beg:end].find('/'):用該方法進(jìn)行查找的時(shí)候糙捺,其返回的索引值是從beg開(kāi)始計(jì)算的,即實(shí)際索引值為beg+返回值

  2. str.capitalize():將字符串轉(zhuǎn)化為首字母大寫其余字母小寫的格式并返回

  3. str.count(sub[, start[, end]])返回在[start, end]中計(jì)算sub字符串出現(xiàn)次數(shù)

  4. str.center(width[, fillchar])返回一個(gè)長(zhǎng)度為width笙隙,中心為str洪灯,以fillchar填充的字符串

  5. str.endswith(suffix[, start[, end]])檢查[start, end]中的字符串是否是以suffix結(jié)尾,返回布爾值

  6. str.format(*args, **kwargs)格式化輸出,譬如"The sum of 1 + 2 is {0}".format(1+2)

  7. str.islower()判斷字符串中是否含有小寫字母竟痰,返回布爾值

  8. str.replace(old, new[, count])將str中的old字符串以new代替签钩,替換次數(shù)為count,默認(rèn)為最大次數(shù)

  9. str.join(iterable)將iter中的元素以str為連接符連接并返回該字符串

  10. str.split(sep=None, maxsplit=-1)以sep為分隔符對(duì)str進(jìn)行分割坏快,maxsplit為分割次數(shù)铅檩,默認(rèn)為最大


namedtuple

看看軍哥寫的namedtuple使用
官方文檔namedtuple

namedtuple的最主要應(yīng)用是使tuple具有可讀性,可以對(duì)索引進(jìn)行命名并通過(guò)該名稱訪問(wèn)對(duì)應(yīng)的值莽鸿。

>>> Point = namedtuple('Point', ['x', 'y'])   # 還可以用'a b c d '這樣的帶空格字符串對(duì)索引進(jìn)行命名
# Point = namedtuple('Point', 'x y') 
>>> p = Point(11, y=22)     # 實(shí)例化昧旨,賦予value
>>> p[0] + p[1]             # tuple的調(diào)用方式是可行的
33
>>> x, y = p                # 支持類似tuple的自動(dòng)解包
>>> x, y
(11, 22)
>>> p.x + p.y               # 以key獲得value
33
>>> p                       # namedtuple的__repr__方式
Point(x=11, y=22)

想要進(jìn)行表格數(shù)據(jù)的轉(zhuǎn)換的話非常方便。

namedtuple的幾個(gè)常用方法 以上文的p為例

  1. p._make(iterable): 將namedtuple中的key和value用一個(gè)iterable對(duì)象替換

  2. p._asdict():將namedtuple轉(zhuǎn)換為一個(gè)ordereddict [('x', 11), ('y', 22)]

  3. p._replace(**kwargs):將name中某一個(gè)key的value改變

  4. p._fields():返回name中所有的field name


正則表達(dá)式

這次的話可以使用正則表達(dá)式對(duì)url進(jìn)行一次匹配富拗,然后從匹配對(duì)象中找到需要的scheme等

這一串是軍哥用到的匹配表達(dá)式臼予,來(lái)慢慢看下吧

待匹配字符串   <scheme>://<netloc>/<path>?<query_params>#<fragment>

^(http[s]?):\/\/([^\/\s]+)([\/\w\-\.]+[^#?\s]*)?(\?([^#]*))?(#(.*))?$

^ (http[s]?)  :\/\/  ([^\/\s]+)  ([\/\w\-\.]+[^#?\s]*)?  (\?([^#]*))?  (#(.*))?$      #我用空格分開(kāi)了下鸣戴,比較好看清楚
  1. ^:字符串第一個(gè)字符開(kāi)始匹配啃沪,沒(méi)有匹配字符則匹配失敗

  2. (...):分組,從左到右為每個(gè)分組分配索引1窄锅、2创千、3、4...入偷,便于使用group()方法獲取不同匹配對(duì)象追驴;需要注意的是每一個(gè)(都會(huì)使索引序數(shù)+1

  3. [...]:字符集,匹配該字符集內(nèi)任意字符

  4. ?:匹配前一個(gè)字符0次或1次

  5. \:轉(zhuǎn)義字符疏之,當(dāng)需要匹配正則表達(dá)式中的諸如殿雪?.等特殊字符時(shí)使用

  6. \s:匹配空白字符

  7. +:匹配前一個(gè)字符1次或無(wú)限次

  8. \w:單詞字符,[a-z,A-Z,0-9]

  9. *:匹配前一個(gè)字符0或無(wú)數(shù)次

  10. $:匹配字符串末尾


因此整體來(lái)看锋爪,軍哥使用的正則表達(dá)式匹配的思路是:

  1. ^(http[s]?):在開(kāi)頭匹配http或者h(yuǎn)ttps丙曙,group(1)得到scheme;

  2. ://:匹配“://”其骄;

  3. ([^/\s]+):匹配非“\”字符和非空白字符構(gòu)成的字符集一次或無(wú)數(shù)次亏镰,group(2)得到netloc;

  4. ([/\w-.]+[^#?\s]*)?:匹配“\”“單詞字符”“-”“.”構(gòu)成的字符集一次或無(wú)數(shù)次拯爽,然后匹配非“#”非“索抓?”和非“空白字符”構(gòu)成的字符集0次或1次,對(duì)該匹配模式匹配0次或1次得到group(3),即path;

  5. (?([^#]*))?:對(duì)”?“和一個(gè)或無(wú)數(shù)個(gè)非”#“字符構(gòu)成的匹配模式匹配0次或1次逼肯,group(4)匹配最外層括號(hào)耸黑,group(5)匹配內(nèi)層小括號(hào),即query_params

  6. (#(.*))?$:在末尾匹配”#“和一個(gè)或無(wú)數(shù)個(gè)”.“構(gòu)成的匹配模式0次或1次汉矿,其中一個(gè)或無(wú)數(shù)個(gè)“.”構(gòu)成了group(7)崎坊,即需要的fragment,“#”和group(7)則構(gòu)成了group(6)

這里(...(...)...)的意思是構(gòu)成兩個(gè)group洲拇,其中大括號(hào)對(duì)應(yīng)的為group(i)的話奈揍,小括號(hào)對(duì)應(yīng)的就是group(i+1),匹配模式分別為其括號(hào)內(nèi)對(duì)應(yīng)的內(nèi)容赋续。

最后附上自己的代碼

class UrlParse:
    def __init__(self, url):
        self.url = url
        self.colon_index = url.find(':')
        self.single_smash_index = self.colon_index + 3 + url[self.colon_index+3:].find('/')  # +3是用于去除雙斜桿影響
        self.question_mark_index = url.find('?')
        self.hash_index = url.find('#')

        def get_scheme():  # scheme一定是在第一個(gè)男翰,并且以冒號(hào)結(jié)束
            return self.url[:self.colon_index]

        def get_netloc():  # 雙斜桿開(kāi)始,單斜桿結(jié)束
            return self.url[self.colon_index+3:self.single_smash_index]

        def get_path():
            return self.url[self.single_smash_index:self.question_mark_index]  # 包括單斜桿

        def get_query_params():  # para有時(shí)不止兩個(gè)
            params = self.url[self.question_mark_index+1:self.hash_index]
            paras = params.split('&')

            def get_para(para):
                equal_index = para.find('=')
                return para[:equal_index], para[equal_index+1:]

            parameters = dict()
            for parameter in paras:
                para_name, para_value = get_para(parameter)
                parameters.setdefault(para_name, para_value)
            return parameters

        def get_fragment():
            return self.url[self.hash_index+1:]

        self.scheme = get_scheme()
        self.netloc = get_netloc()
        self.path = get_path()
        self.query_params = get_query_params()
        self.fragment = get_fragment()


url = UrlParse("http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652566513#wechat_redirect")
print(url.scheme)
print(url.netloc)
print(url.path)
print(url.query_params)
print(url.fragment)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纽乱,一起剝皮案震驚了整個(gè)濱河市蛾绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸦列,老刑警劉巖租冠,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薯嗤,居然都是意外死亡顽爹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門骆姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镜粤,“玉大人,你說(shuō)我怎么就攤上這事玻褪∪饪剩” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵带射,是天一觀的道長(zhǎng)同规。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窟社,這世上最難降的妖魔是什么券勺? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮桥爽,結(jié)果婚禮上朱灿,老公的妹妹穿的比我還像新娘。我一直安慰自己钠四,他們只是感情好盗扒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布跪楞。 她就那樣靜靜地躺著,像睡著了一般侣灶。 火紅的嫁衣襯著肌膚如雪甸祭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天褥影,我揣著相機(jī)與錄音池户,去河邊找鬼。 笑死凡怎,一個(gè)胖子當(dāng)著我的面吹牛校焦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统倒,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寨典,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了房匆?” 一聲冷哼從身側(cè)響起耸成,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浴鸿,沒(méi)想到半個(gè)月后井氢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岳链,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年花竞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宠页。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡左胞,死狀恐怖寇仓,靈堂內(nèi)的尸體忽然破棺而出举户,到底是詐尸還是另有隱情,我是刑警寧澤遍烦,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布俭嘁,位于F島的核電站,受9級(jí)特大地震影響服猪,放射性物質(zhì)發(fā)生泄漏供填。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一罢猪、第九天 我趴在偏房一處隱蔽的房頂上張望近她。 院中可真熱鬧,春花似錦膳帕、人聲如沸粘捎。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攒磨。三九已至泳桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娩缰,已是汗流浹背灸撰。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拼坎,地道東北人浮毯。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泰鸡,于是被迫代替她去往敵國(guó)和親亲轨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容