印象中知道正则表达式很有用,需要用时上网查资料(答案)照搬,感觉好像学会了,下次需要用到时似乎又忘记了,仿佛陷入了一个迷之自信的怪圈,最后结果就是感觉好像会,但其实不会!
这不,今天又遇到了,我只是想需要一个not endswith str
这样的正则表达式,一向快糙猛的风格又不得法,拿来主义习惯了,最近上谷歌不太畅通,感觉不会编程了一样,难道是不幸中了传说中面向搜索引擎编程的毒?
还是以解决问题为重。
问题描述?
匹配不是以google
作为结尾的字符串
对应正则表达式如下(可在在线正则表达式测试上验证):
.*(?<!google)$
.*(?!google)$
逐个看答案1字符串意义
-
.
:匹配除换行符以外的任意字符 -
*
:重复零次或更多次 -
(?<!google)
:匹配前面不是google
的位置 -
$
:匹配字符串的结束
.*
通常搭配一起用,表示除换行符以后的任意字符串,$
作为字符串的结尾与字符串的开头^
相对应,这几个都是单字符,很容易记住和运用,相比而言(?<!exp)
就要稍微“复杂“一点点了,无它,多用几次也就记住了。
比较一下二者的执行速度
import re
import time
def get_re_time(pattern, str, count=1000000):
st = time.time()
for _ in range(count):
re.match(pattern, str)
return time.time()-st
if __name__ == "__main__":
for _ in range(10):
print('(?<!exp) seconds is:{} (?<!exp) is seconds:{}'.format(get_re_time('.*(?<!google)$', 'adsfadgoogle'), get_re_time('.*(?!google)$', 'adsfadgoogle')))
结果
(?<!exp) seconds is:0.9892270565032959 (?<!exp) is seconds:0.8230881690979004
(?<!exp) seconds is:0.9732108116149902 (?<!exp) is seconds:0.8235759735107422
(?<!exp) seconds is:0.9880321025848389 (?<!exp) is seconds:0.8225719928741455
(?<!exp) seconds is:0.9598960876464844 (?<!exp) is seconds:0.824509859085083
(?<!exp) seconds is:0.954564094543457 (?<!exp) is seconds:0.8188457489013672
(?<!exp) seconds is:0.958960771560669 (?<!exp) is seconds:0.8349621295928955
(?<!exp) seconds is:1.1263601779937744 (?<!exp) is seconds:0.8461761474609375
(?<!exp) seconds is:0.9537780284881592 (?<!exp) is seconds:0.8274679183959961
(?<!exp) seconds is:1.001042127609253 (?<!exp) is seconds:0.8258669376373291
(?<!exp) seconds is:0.9560801982879639 (?<!exp) is seconds:0.8229031562805176
单以此用例来看,答案2
的速度要快那么一点点,原因暂且不表,留待下回分解。
以下文章值得长期收藏
网友评论