string操作
字符串操作在實(shí)際解決問(wèn)題時(shí)經(jīng)常會(huì)遇到。
個(gè)人認(rèn)為的常用:
str[beg:end].find('/'):用該方法進(jìn)行查找的時(shí)候糙捺,其返回的索引值是從beg開(kāi)始計(jì)算的,即實(shí)際索引值為beg+返回值
str.capitalize():將字符串轉(zhuǎn)化為首字母大寫其余字母小寫的格式并返回
str.count(sub[, start[, end]])返回在[start, end]中計(jì)算sub字符串出現(xiàn)次數(shù)
str.center(width[, fillchar])返回一個(gè)長(zhǎng)度為width笙隙,中心為str洪灯,以fillchar填充的字符串
str.endswith(suffix[, start[, end]])檢查[start, end]中的字符串是否是以suffix結(jié)尾,返回布爾值
str.format(*args, **kwargs)格式化輸出,譬如"The sum of 1 + 2 is {0}".format(1+2)
str.islower()判斷字符串中是否含有小寫字母竟痰,返回布爾值
str.replace(old, new[, count])將str中的old字符串以new代替签钩,替換次數(shù)為count,默認(rèn)為最大次數(shù)
str.join(iterable)將iter中的元素以str為連接符連接并返回該字符串
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為例
p._make(iterable): 將namedtuple中的key和value用一個(gè)iterable對(duì)象替換
p._asdict():將namedtuple轉(zhuǎn)換為一個(gè)ordereddict [('x', 11), ('y', 22)]
p._replace(**kwargs):將name中某一個(gè)key的value改變
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)了下鸣戴,比較好看清楚
^:字符串第一個(gè)字符開(kāi)始匹配啃沪,沒(méi)有匹配字符則匹配失敗
(...):分組,從左到右為每個(gè)分組分配索引1窄锅、2创千、3、4...入偷,便于使用group()方法獲取不同匹配對(duì)象追驴;需要注意的是每一個(gè)(都會(huì)使索引序數(shù)+1
[...]
:字符集,匹配該字符集內(nèi)任意字符?:匹配前一個(gè)字符0次或1次
\
:轉(zhuǎn)義字符疏之,當(dāng)需要匹配正則表達(dá)式中的諸如殿雪?.等特殊字符時(shí)使用\s:匹配空白字符
+:匹配前一個(gè)字符1次或無(wú)限次
\w:單詞字符,[a-z,A-Z,0-9]
*:匹配前一個(gè)字符0或無(wú)數(shù)次
$:匹配字符串末尾
因此整體來(lái)看锋爪,軍哥使用的正則表達(dá)式匹配的思路是:
^(http[s]?):在開(kāi)頭匹配http或者h(yuǎn)ttps丙曙,group(1)得到scheme;
://:匹配“://”其骄;
([^/\s]+):匹配非“\”字符和非空白字符構(gòu)成的字符集一次或無(wú)數(shù)次亏镰,group(2)得到netloc;
([/\w-.]+[^#?\s]*)?:匹配“\”“單詞字符”“-”“.”構(gòu)成的字符集一次或無(wú)數(shù)次拯爽,然后匹配非“#”非“索抓?”和非“空白字符”構(gòu)成的字符集0次或1次,對(duì)該匹配模式匹配0次或1次得到group(3),即path;
(?([^#]*))?:對(duì)”?“和一個(gè)或無(wú)數(shù)個(gè)非”#“字符構(gòu)成的匹配模式匹配0次或1次逼肯,group(4)匹配最外層括號(hào)耸黑,group(5)匹配內(nèi)層小括號(hào),即query_params
(#(.*))?$:在末尾匹配”#“和一個(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)