2017-09-21 41 views
1

我是編程和閱讀「使用Python自動化枯燥的東西」這本書的初學者,在第7章中有一個項目實踐:strip()的正則表達式版本。下面,將strip_chars不插補,也就是說它是作爲字符串的一部分,處理不工作(我使用Python 3.6.1)。誰能幫助?Python:使用正則表達式的條形函數定義

import re 

string = input("Enter a string to strip: ") 
strip_chars = input("Enter the characters you want to be stripped: ") 

def strip_fn(string, strip_chars): 
    if strip_chars == '': 
     blank_start_end_regex = re.compile(r'^(\s)+|(\s)+$') 
     stripped_string = blank_start_end_regex.sub('', string) 
     print(stripped_string) 
    else: 
     strip_chars_start_end_regex = re.compile(r'^(strip_chars)*|(strip_chars)*$') 
     stripped_string = strip_chars_start_end_regex.sub('', string) 
     print(stripped_string) 
+1

不工作如何,併爲什麼輸入? –

+1

'r'^(strip_chars)* |(strip_chars)* $'' - >'r'^ [{0}] + | [{0}] + $'.format(「」。join([re.escape (x)for strip_chars]))'。另外,在'r'^(\ s)+ |(\ s)+ $''中刪除不必要的'('和')''。 –

回答

0

當使用r'^(strip_chars)*|(strip_chars)*$'字符串文字,你需要把它作爲一個變量傳遞給正則表達式,然而,將它傳遞給當前表單會導致「損壞」的正則表達式,因爲在正則表達式中(...)分組構造,而y您希望匹配存儲在strip_chars變量中的定義字符集中的單個字符。

您可以用一對[]來包裝字符串來創建一個字符類,但是如果該變量包含,比如說z-a,它會使得生成的模式無效。您還需要轉義每個字符以保證安全。當

更換

r'^(strip_chars)*|(strip_chars)*$' 

r'^[{0}]+|[{0}]+$'.format("".join([re.escape(x) for x in strip_chars])) 

我建議用+出現一次或多次)量詞來代替*零個或多個),因爲在大多數情況下,我們想刪除一些東西,我們需要匹配至少1次不必要的字符串。

此外,您可以用r'^\s+|\s+$'替換r'^(\s)+|(\s)+$',因爲重複捕獲組將在每次迭代時繼續重寫組值,稍微妨礙正則表達式的執行。

0

您還可以使用re.sub替換開始或結束中的字符。 讓我們說,如果一個字符是「X」

re.sub(r'^x+', "", string) 
re.sub(r'x+$', "", string) 

第一線lstrip和rstrip 這只是看起來簡單第二。

相關問題