成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何正確保留大括號?

開發 前端
自從Python 3.6開始,引入了f表達式(f-string),這使得Python在填充字符串時可以進行一些簡單的計算。并且f表達式的運算速度是字符串.format方法的很多倍。

[[377067]]

自從Python 3.6開始,引入了f表達式(f-string),這使得Python在填充字符串時可以進行一些簡單的計算。并且f表達式的運算速度是字符串.format方法的很多倍。

無論是f表達式還是字符串的.format方法,我們都可以使用大括號作為占位符,來填充數據。例如:

  1. >>> name = 'kingname' 
  2. >>> print(f'我的名字是:{name}'
  3. 我的名字是:kingname 
  4. >>> print(f'1+1的結果為:{1 + 1}'
  5. 1+1的結果為:2 
  6. >>> salary = 999999 
  7. >>> print('我的月薪是:{salary}'.format(salary=salary)) 
  8. 我的月薪是:999999 

但現在問題來了,如果我希望在使用f表達式或者.format方法填充內容的同時,又能保留大括號應該怎么辦呢?

舉個例子,在寫爬蟲的時候,我需要使用正則表達式從當前URL中提取當前的頁數:page=\d{0,3}。但是,對于不同的網站,表示頁數的這個參數名可能是不一樣的,有些是page=xxx,有些是Pag=xxx,有些是pageNo=xxx,有些是p=xxx。所以我想動態生成這個正則表達式。

如果我們直接使用f表達式或者.format方法,就會報錯:

  1. >>> page_name = 'page' 
  2. >>> page_regex_template = '{page_name}=\d{0,3}' 
  3. >>> print(page_regex_template.format(page_name=page_name)) 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. KeyError: '0,3' 

為了能夠正常生成正則表達式,可能有人會想到使用古老的%s占位符:

  1. >>> page_name = 'page' 
  2. >>> page_regex_template = '%s=\d{0,3}' 
  3. >>> print(page_regex_template % page_name) 
  4. page=\d{0,3} 

雖然確實可行,但是混用兩種填充字符串的方法,代碼會變得不好維護,而且%s這種占位符填充速度也非常慢。

實際上,在Python的f表達式和.format方法中,如果你需要保留大括號,那么只需要寫成大括號套大括號的形式就行了:

  1. >>> page_name = 'page' 
  2. >>> page_regex_template = '{page_name}=\d{{0,3}}' 
  3. >>> print(page_regex_template.format(page_name=page_name)) 
  4. page=\d{0,3} 

大括號里面的第一層大括號會自動失效,變成普通的字符。但如果是大括號套大括號套大括號,那么最里面的一對大括號會繼續生效充當占位符,例如:

  1. >>> page_name = 'page' 
  2. >>> page_range = '0,5' 
  3. >>> page_regex_template = '{page_name}=\d{{{page_range}}}' 
  4. >>> print(page_regex_template.format(page_name=page_name, page_range=page_range)) 
  5. page=\d{0,5} 

總結起來就是,如果從外向內數,如果最外層大括號稱為第1層,那么,第奇數層的大括號用來填充數據,第偶數層的大括號就是普通的字符。因此,如果不考慮代碼可讀性,如果我們需要最終生成的字符串本身就是嵌套大括號的形式,我們還可以進一步寫成:

  1. >>> ugly_string = '2層嵌套大括號:{{{{{variable}}}}}' 
  2. >>> print(ugly_string.format(variable=variable)) 
  3. 2層嵌套大括號:{{name}} 
  4. >>> ugly_string = '3層嵌套大括號:{{{{{{{variable}}}}}}}' 
  5. >>> print(ugly_string.format(variable=variable)) 
  6. 3層嵌套大括號:{{{name}}} 

假設我們希望最終輸出的字符串里面,保留n層大括號,那么在代碼里面,我們需要寫2n + 1層大括號。大家也看出來了,如果你要這樣寫,數大括號的個數都要把你的眼鏡數瞎。所以,在實際開發中,大括號的層數絕對不要超過2層。

以下內容供學有余力的同學閱讀。

上面講到的方法,適用于大括號成對出現的情況,如果大括號只有半邊,例如有些網站的正文信息是以JSON格式寫在源代碼里面的,于是我們可以使用正則表達式提取出包含正文的JSON然后進一步處理,一般來說,正則表達式可能是這樣的:content=(\{);。不過,有的網站用的單詞是content,有的網站用的是detail,所以這個地方需要填充,如果我們像往常那樣寫,那么還是會報錯,例如:

  1. >>> content_name = 'detail' 
  2. >>> content_json_template = '{content_name}=({\{})$' 
  3. >>> print(content_json_template.format(content_name=content_name)) 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. ValueError: unexpected '{' in field name 

套一層不行,那我們看看套兩層如何:

  1. >>> content_name = 'detail' 
  2. >>> content_json_template = '{content_name}=({{\{}})$' 
  3. >>> print(content_json_template.format(content_name=content_name)) 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. IndexError: Replacement index 0 out of range for positional args tuple 

套兩層還是錯。

如果字符串不含反斜杠,我們可以使用f表達式配合引號包住半邊大括號來實現,例如:

  1. >>> name = 'kingname' 
  2. >>> print(f'我的名字是:{name},我的參數是:{"{"}'
  3. 我的名字是:kingname,我的參數是:{ 

但問題是,f表達式里面是不允許出現反斜杠的,否則會報錯:

  1. >>> content_name = 'detail' 
  2. >>> content_regex = f'{content_name}=({\"{"})$' 
  3.   File "<stdin>", line 1 
  4. SyntaxError: f-string expression part cannot include a backslash 

而.format方法支持反斜杠,但它又不支持引號包住單邊大括號的寫法:

  1. >>> name = 'kingname' 
  2. >>> print('我的名字是:{name},我的參數是:{"{"}'.format(name=name)) 
  3. Traceback (most recent call last): 
  4.   File "<stdin>", line 1, in <module> 
  5. ValueError: unexpected '{' in field name 

遇到這種情況,我們應該怎么解決呢?只要把思路放開,靈活變通,能找出很多方法,這里僅舉兩例:

把大括號放到值里面

把思路調整過來,既然大括號不能放在句子模板里面,那我們就放在被填充的值里面:

  1. # 使用.format方法 
  2. >>> name = 'kingname' 
  3. >>> brace = '{' 
  4. >>> print('我的名字是:{name},我的參數是:{brace}'.format(name=name, brace=brace)) 
  5. 我的名字是:kingname,我的參數是:{ 
  6.      
  7. # 使用f表達式 
  8. >>> content_name = 'detail' 
  9. >>> brace = '\{' 
  10. >>> print(f'{content_name}=({brace})$'
  11. detail=(\{)$ 

不要忘記字符串拼接

大家最容易犯的一個問題就是學了新的東西,就忘記了舊的,實際上用字符串拼接也能解決問題:

  1. >>> content_name = 'detail' 
  2. >>> content_json = content_name + '=(\{)$' 
  3. >>> print(content_json) 
  4. detail=(\{)$ 

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2011-03-10 16:11:01

JavaScript

2021-01-27 21:53:50

版權保護隱寫

2010-07-13 17:31:56

SQL Server恢

2021-01-27 11:31:48

物聯網設備物聯網IOT

2024-07-30 08:16:18

Python代碼工具

2015-08-25 10:20:47

云堆棧hypervisor虛擬化

2020-06-14 16:21:06

液體冷卻SLA數據中心

2013-12-03 16:38:35

vSphere HA虛擬機

2009-08-14 14:31:43

2011-03-25 11:39:29

2024-02-20 08:45:13

雙大括號建立Java Map通用的模式

2015-08-21 08:59:25

hypervisor云堆棧

2015-09-24 10:08:27

hypervisor

2013-11-01 09:15:21

2010-08-03 16:00:08

2019-07-25 10:44:52

2020-07-02 14:42:26

網絡驗證業務

2014-12-18 10:57:27

數據安全敏感數據數據保護

2022-07-27 11:00:04

AI財務AI

2023-09-08 12:19:01

線程方法interrupt
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜免费在线视频 | 91av视频在线 | 欧美一级特黄aaa大片在线观看 | 久草热线 | 99re99| 国产乱码精品一区二区三区忘忧草 | 青娱乐国产 | 国产一区二区在线播放视频 | 国产精品日韩在线观看 | 99国产视频 | 国产精品福利网站 | 精品视频一区二区三区 | 欧美日韩一 | 国产精品久久久久久吹潮 | 国产美女久久 | 青青草原综合久久大伊人精品 | 日韩精品免费在线观看 | 欧美精品一区二区三区在线播放 | 国产98色在线 | 日韩 | 伊人精品在线 | 欧美日韩高清在线观看 | 97国产精品视频人人做人人爱 | 成人精品一区二区 | 91精品中文字幕一区二区三区 | 久久久久久综合 | 久久大陆 | 久久久久国产 | 精品视频一区二区 | 日韩精品一区二区三区久久 | 亚洲成人动漫在线观看 | 自拍偷拍第一页 | 俺去俺来也www色官网cms | 女生羞羞网站 | 成人欧美一区二区三区在线播放 | 一区二区在线 | 欧美日韩亚洲视频 | 日韩一区二区视频 | 国产欧美视频一区二区三区 | 欧美日韩视频 | 亚洲高清免费观看 | 日韩福利视频 |