Python控制臺獲取輸入與常見的正則表達式用法
前言
在Python編程中,控制臺輸入和正則表達式是兩個重要而實用的概念。掌握這兩個技巧可以幫助我們更靈活地處理用戶輸入以及對文本進行復雜的匹配和處理。本文中將詳細介紹Python中如何通過控制臺獲取用戶輸入以及如何使用正則表達式進行文本處理。深入探討輸入類型轉換、異常處理、多個輸入值的存儲等方面,并分享一些常見的正則表達式用法,如匹配數(shù)字、替換字符串、提取模式內容等。
一、控制臺獲取輸入
1.1 字符串輸入
# 輸入字符串并賦值給變量str1: str1 = input("請輸入一個字符串: ")
1.2 整數(shù)輸入
# 輸入整數(shù)并賦值給變量count: count = int(input("請輸入一個整數(shù): "))
1.3 浮點數(shù)輸入
# 輸入浮點數(shù)并賦值給變量float_num: float_num = float(input("請輸入一個浮點數(shù): "))
1.4 布爾值輸入
# 輸入布爾值(True/False)并賦值給變量is_true: is_true = bool(input("請輸入一個布爾值(True/False): "))
請注意,bool()函數(shù)將任何非空字符串解釋為True,空字符串解釋為False。
1.5 列表輸入
# 輸入多個數(shù)字以空格分隔,并將它們作為列表存儲在變量list1中: list1 = input("請輸入多個數(shù)字(以空格分隔): ").split() list1 = [int(num) for num in list1] # 將輸入的數(shù)字轉換為整數(shù)類型 print(list1)
這里使用了split()方法將輸入的字符串切分成一個字符串列表,并使用列表推導式將字符串轉換為整數(shù)類型。
# 輸入多個字符串以逗號分隔,并將它們作為列表存儲在變量str_list中: str_list = input("請輸入多個字符串(以逗號分隔): ").split(',')
這里使用了split()方法將輸入的字符串切分成一個字符串列表,以逗號為分隔符。
1.6 匯總
# 在Python中,可以使用input()函數(shù)從控制臺獲取用戶的輸入。然后,根據(jù)需要進行類型轉換和賦值。下面是一些示例: # 輸入字符串并賦值給變量str1: str1 = input("請輸入一個字符串: ") # 輸入整數(shù)并賦值給變量count: count = int(input("請輸入一個整數(shù): ")) # 輸入浮點數(shù)并賦值給變量float_num: float_num = float(input("請輸入一個浮點數(shù): ")) # 輸入布爾值(True/False)并賦值給變量is_true: is_true = bool(input("請輸入一個布爾值(True/False): ")) # 請注意,bool()函數(shù)將任何非空字符串解釋為True,空字符串解釋為False。 # 輸入多個數(shù)字以空格分隔,并將它們作為列表存儲在變量list1中: list1 = input("請輸入多個數(shù)字(以空格分隔): ").split() list1 = [int(num) for num in list1] # 將輸入的數(shù)字轉換為整數(shù)類型 print(list1) # 這里使用了split()方法將輸入的字符串切分成一個字符串列表,并使用列表推導式將字符串轉換為整數(shù)類型。 # 輸入多個字符串以逗號分隔,并將它們作為列表存儲在變量str_list中: str_list = input("請輸入多個字符串(以逗號分隔): ").split(',') # 這里使用了split()方法將輸入的字符串切分成一個字符串列表,以逗號為分隔符。 # 記住,在處理用戶輸入時要小心異常情況,例如錯誤的類型轉換或無效的輸入。
二、正則表達式
2.1 匹配數(shù)字
# 導入re模塊: import re # 匹配字符串中的數(shù)字: pattern = r'\d+' # 匹配連續(xù)的數(shù)字 text = "abc123def456ghi" result = re.findall(pattern, text) print(result) # 輸出: ['123', '456']
2.2 模式檢查
# 檢查字符串是否符合特定的模式: pattern = r'^[A-Za-z0-9]+$' # 檢查是否只包含字母和數(shù)字 text = "abc123" result = re.match(pattern, text) if result: print("字符串符合要求") else: print("字符串不符合要求")
2.3 替換字符
# 替換字符串中的部分內容: pattern = r'\s+' # 匹配連續(xù)的空格 text = "Hello World" new_text = re.sub(pattern, ' ', text) #表示把多個空格替換成一個空格 print(new_text) # 輸出: "Hello World"
2.4 切分字符串
# 切分字符串: pattern = r'[,\s]+' # 匹配逗號或空格 text = "apple,banana,orange" result = re.split(pattern, text) print(result) # 輸出: ['apple', 'banana', 'orange']
2.5 搜索并提取匹配的部分
# 搜索并提取匹配的部分: pattern = r'\d{3}-\d{4}-\d{4}' # 匹配電話號碼的模式 text = "我的電話號碼是:123-4567-8901" result = re.search(pattern, text) if result: print(result.group()) # 輸出: '123-4567-8901'
注意: re.search() 與re.match()返回第一個匹配項,與 re.search() 不同的是,re.match() 方法只匹配字符串的開頭部分。因此,如果需要輸出所有匹配項,應該使用 re.findall() 方法。
2.6 使用捕獲組提取匹配的部分
# 使用捕獲組提取匹配的部分: pattern = r'(\d{3})-(\d{4})-(\d{4})' # 匹配電話號碼的模式,并使用捕獲組分別提取區(qū)號、中間號和尾號 text = "我的電話號碼是:123-4567-8901" result = re.search(pattern, text) if result: area_code = result.group(1) middle_number = result.group(2) last_number = result.group(3) print(area_code, middle_number, last_number) # 輸出: '123', '4567', '8901'
2.7 非貪婪匹配
# 非貪婪匹配(匹配最短的字符串): pattern = r'<.*?>' # 非貪婪匹配尖括號之間的內容 text = "<p>這是一個段落</p><p>另一個段落</p>" result = re.findall(pattern, text) print(result) # 輸出: ['<p>', '</p>', '<p>', '</p>']
2.8 忽略大小寫匹配
# 忽略大小寫匹配: pattern = r'python' text = "Python is a programming language" result = re.findall(pattern, text, re.IGNORECASE) print(result) # 輸出: ['Python']
2.9 使用預定義字符類
# 使用預定義字符類: pattern = r'\w+' # 匹配字母、數(shù)字和下劃線 text = "Hello 123_world*&" result = re.findall(pattern, text) print(result) # 輸出: ['Hello', '123_world']
2.10 自定義字符類
# 自定義字符類: pattern = r'[aeiou]' # 匹配元音字母 text = "apple orange banana" result = re.findall(pattern, text) print(result) # 輸出: ['a', 'e', 'o', 'a', 'a']
2.11 零寬斷言
# 零寬斷言(Lookahead/Lookbehind):零寬斷言允許你在匹配字符串時指定一些條件,但不會將這些條件包含在最終的匹配結果中。例如,可以使用正向零寬斷言來匹配前面是特定模式的文本: pattern = r'\w+(?=ing)' # 匹配以 "ing" 結尾的單詞的前面部分 text = "running jumping swimming" result = re.findall(pattern, text) print(result) # 輸出: ['runn', 'jump']
2.12 多行模式
# 多行模式:使用多行模式可以處理多行文本,其中 ^ 和 $ 元字符匹配每行的開頭和結尾。通過傳遞 re.MULTILINE 標志給 re.compile() 函數(shù)或使用 re.M 縮寫標志來啟用多行模式: pattern = r'^\d+$' # 匹配只包含數(shù)字的行 text = "123\nabc\n456\n789" result = re.findall(pattern, text, re.MULTILINE) print(result) # 輸出: ['123', '456', '789']
2.13 嵌入式修飾符
# 嵌入式修飾符:可以在正則表達式中使用嵌入式修飾符來改變匹配的行為。例如,使用 (?i) 來忽略大小寫匹配: pattern = r'(?i)python' # 忽略大小寫匹配 "python" text = "Python is a programming language" result = re.findall(pattern, text) print(result) # 輸出: ['Python']
2.14 替換時使用回調函數(shù)
# 替換時使用回調函數(shù):使用 re.sub() 函數(shù)進行替換時,可以傳遞一個回調函數(shù)來處理每個匹配項,并返回替換后的結果。這允許你根據(jù)匹配到的內容動態(tài)生成替換值: def replace_func(match): num = int(match.group(0)) return str(num*2) pattern = r'\d+' text = "123423w 2w 3yui 4 5" result = re.sub(pattern, replace_func, text) print(result) #246846w 4w 6yui 8 10
2.15 非捕獲組
# 非捕獲組:有時你可能需要使用括號進行分組,但不需要捕獲該組的內容。在這種情況下,可以使用非捕獲組 (?:...): pattern = r'(?:https?://)?(www\.[A-Za-z]+\.[A-Za-z]+)' text = "Visit my website at www.example.com" result = re.findall(pattern, text) print(result) # 輸出: ['www.example.com']
2.16 前向引用(匹配重復子字符串)
# 前向引用:前向引用允許你引用之前已經(jīng)匹配的內容。這在匹配重復的子字符串時非常有用: pattern = r'(\w+)\s+\1' # 匹配重復的單詞 text = "apple apple banana banana cherry cherry" result = re.findall(pattern, text) print(result) # 輸出: ['apple', 'banana', 'cherry']
2.17 替換中使用命名分組引用
# 替換中使用命名分組引用:可以使用命名分組 (P<name>...) 來指定一個命名的捕獲組,并在替換時使用 \\g<name> 引用該組的內容: pattern = r'(?P<first>\d+)\s+(?P<second>\d+)' text = "10 20" result = re.sub(pattern, '\\g<second> \\g<first>', text) print(result) # 輸出: "20 10"
2.18 回溯引用
# 回溯引用:使用回溯引用可以匹配重復的模式,并在替換時保留其中一個副本: pattern = r'(\d+)-\1' # 匹配連續(xù)重復的數(shù)字,例如 "22-22" text = "11-11 22-22 33-33" result = re.findall(pattern, text) print(result) # 輸出: ['11', '22', '33']
2.19 負向前向引用
# 負向前向引用:負向前向引用允許你指定一個模式,該模式不能在當前位置之后出現(xiàn)??梢允褂?(?!...) 來表示負向前向引用: pattern = r'\b(?!un)\w+\b' # 匹配不以 "un" 開頭的單詞 text = "happy unhappy apple banana" result = re.findall(pattern, text) print(result) # 輸出: ['happy', 'apple', 'banana']
2.20 嵌入條件匹配
# 嵌入條件匹配:使用 (?if:...) 來實現(xiàn)條件匹配。可以根據(jù)條件選擇不同的模式進行匹配: pattern = r'(?i)(?:(?<=Mr\.)|(?<=Ms\.)|(?<=Mrs\.))\s\w+' text = "Hello Mr. Smith, Ms. Johnson, and Mrs. Davis" result = re.findall(pattern, text) print(result) # 輸出: ['Smith', 'Johnson', 'Davis']
2.21 后向引用斷言
# 后向引用斷言:使用 (?<=(...)) 來實現(xiàn)后向引用斷言,即在匹配的位置之前必須滿足某個條件: pattern = r'\b(\w+)\b(?<=(ing))' # 匹配以 "ing" 結尾的單詞中的前面部分 text = "running jumping swimming" result = re.findall(pattern, text) print(result) # 輸出: ['runn', 'jump']
2.22 零寬負向斷言
# 零寬負向斷言:使用 (?<!...) 來實現(xiàn)零寬負向斷言,即在當前位置之前不能滿足某個條件: pattern = r'(?<!un)\b\w+\b' # 匹配不以 "un" 開頭的單詞 text = "happy unhappy apple banana" result = re.findall(pattern, text) print(result) # 輸出: ['happy', 'apple', 'banana']
2.23 轉義序列匹配非打印字符
# 非打印字符:可以使用轉義序列來匹配非打印字符,如制表符 \t、換行符 \n 等: pattern = r'abc\tdef\nghi' text = "abc\tdef\nghi" result = re.findall(pattern, text) print(result) # 輸出: ['abc\tdef\nghi']
2.24 貪婪與非貪婪匹配
# 貪婪與非貪婪匹配:在重復模式中,默認情況下是貪婪匹配,盡可能多地匹配。但可以使用 ? 來指定非貪婪匹配,盡可能少地匹配: s = "aaaabaaaa" pattern = r'a.*a' # 貪婪匹配模式 match = re.search(pattern, s) if match: print(match.group()) # 輸出:'aaaabaaaa' s = "aaaabaaaa" pattern = r'a.*?a' # 非貪婪匹配模式 match = re.search(pattern, s) if match: print(match.group()) # 輸出:'aaa'
2.25 匯總
# 在Python中,可以使用正則表達式模塊re來進行字符串的匹配和處理。下面是一些常見的正則處理示例: # 導入re模塊: import re # 匹配字符串中的數(shù)字: pattern = r'\d+' # 匹配連續(xù)的數(shù)字 text = "abc123def456ghi" result = re.findall(pattern, text) print(result) # 輸出: ['123', '456'] # 檢查字符串是否符合特定的模式: pattern = r'^[A-Za-z0-9]+$' # 檢查是否只包含字母和數(shù)字 text = "abc123" result = re.match(pattern, text) if result: print("字符串符合要求") else: print("字符串不符合要求") # 替換字符串中的部分內容: pattern = r'\s+' # 匹配連續(xù)的空格 text = "Hello World" new_text = re.sub(pattern, ' ', text) #表示把多個空格替換成一個空格 print(new_text) # 輸出: "Hello World" # 切分字符串: pattern = r'[,\s]+' # 匹配逗號或空格 text = "apple,banana,orange" result = re.split(pattern, text) print(result) # 輸出: ['apple', 'banana', 'orange'] # 搜索并提取匹配的部分: pattern = r'\d{3}-\d{4}-\d{4}' # 匹配電話號碼的模式 text = "我的電話號碼是:123-4567-8901" result = re.search(pattern, text) if result: print(result.group()) # 輸出: '123-4567-8901' # 使用捕獲組提取匹配的部分: pattern = r'(\d{3})-(\d{4})-(\d{4})' # 匹配電話號碼的模式,并使用捕獲組分別提取區(qū)號、中間號和尾號 text = "我的電話號碼是:123-4567-8901" result = re.search(pattern, text) if result: area_code = result.group(1) middle_number = result.group(2) last_number = result.group(3) print(area_code, middle_number, last_number) # 輸出: '123', '4567', '8901' # 非貪婪匹配(匹配最短的字符串): pattern = r'<.*?>' # 非貪婪匹配尖括號之間的內容 text = "<p>這是一個段落</p><p>另一個段落</p>" result = re.findall(pattern, text) print(result) # 輸出: ['<p>', '</p>', '<p>', '</p>'] # 忽略大小寫匹配: pattern = r'python' text = "Python is a programming language" result = re.findall(pattern, text, re.IGNORECASE) print(result) # 輸出: ['Python'] # 使用預定義字符類: pattern = r'\w+' # 匹配字母、數(shù)字和下劃線 text = "Hello 123_world*&" result = re.findall(pattern, text) print(result) # 輸出: ['Hello', '123_world'] # 自定義字符類: pattern = r'[aeiou]' # 匹配元音字母 text = "apple orange banana" result = re.findall(pattern, text) print(result) # 輸出: ['a', 'e', 'o', 'a', 'a'] # 零寬斷言(Lookahead/Lookbehind):零寬斷言允許你在匹配字符串時指定一些條件,但不會將這些條件包含在最終的匹配結果中。例如,可以使用正向零寬斷言來匹配前面是特定模式的文本: pattern = r'\w+(?=ing)' # 匹配以 "ing" 結尾的單詞的前面部分 text = "running jumping swimming" result = re.findall(pattern, text) print(result) # 輸出: ['runn', 'jump'] # 多行模式:使用多行模式可以處理多行文本,其中 ^ 和 $ 元字符匹配每行的開頭和結尾。通過傳遞 re.MULTILINE 標志給 re.compile() 函數(shù)或使用 re.M 縮寫標志來啟用多行模式: pattern = r'^\d+$' # 匹配只包含數(shù)字的行 text = "123\nabc\n456\n789" result = re.findall(pattern, text, re.MULTILINE) print(result) # 輸出: ['123', '456', '789'] # 嵌入式修飾符:可以在正則表達式中使用嵌入式修飾符來改變匹配的行為。例如,使用 (?i) 來忽略大小寫匹配: pattern = r'(?i)python' # 忽略大小寫匹配 "python" text = "Python is a programming language" result = re.findall(pattern, text) print(result) # 輸出: ['Python'] # 替換時使用回調函數(shù):使用 re.sub() 函數(shù)進行替換時,可以傳遞一個回調函數(shù)來處理每個匹配項,并返回替換后的結果。這允許你根據(jù)匹配到的內容動態(tài)生成替換值: def replace_func(match): num = int(match.group(0)) return str(num*2) pattern = r'\d+' text = "123423w 2w 3yui 4 5" result = re.sub(pattern, replace_func, text) print(result) #246846w 4w 6yui 8 10 # 非捕獲組:有時你可能需要使用括號進行分組,但不需要捕獲該組的內容。在這種情況下,可以使用非捕獲組 (?:...): pattern = r'(?:https?://)?(www\.[A-Za-z]+\.[A-Za-z]+)' text = "Visit my website at www.example.com" result = re.findall(pattern, text) print(result) # 輸出: ['www.example.com'] # 前向引用:前向引用允許你引用之前已經(jīng)匹配的內容。這在匹配重復的子字符串時非常有用: pattern = r'(\w+)\s+\1' # 匹配重復的單詞 text = "apple apple banana banana cherry cherry" result = re.findall(pattern, text) print(result) # 輸出: ['apple', 'banana', 'cherry'] # 替換中使用命名分組引用:可以使用命名分組 (P<name>...) 來指定一個命名的捕獲組,并在替換時使用 \\g<name> 引用該組的內容: pattern = r'(?P<first>\d+)\s+(?P<second>\d+)' text = "10 20" result = re.sub(pattern, '\\g<second> \\g<first>', text) print(result) # 輸出: "20 10" # 回溯引用:使用回溯引用可以匹配重復的模式,并在替換時保留其中一個副本: pattern = r'(\d+)-\1' # 匹配連續(xù)重復的數(shù)字,例如 "22-22" text = "11-11 22-22 33-33" result = re.findall(pattern, text) print(result) # 輸出: ['11', '22', '33'] # 負向前向引用:負向前向引用允許你指定一個模式,該模式不能在當前位置之后出現(xiàn)??梢允褂?(?!...) 來表示負向前向引用: pattern = r'\b(?!un)\w+\b' # 匹配不以 "un" 開頭的單詞 text = "happy unhappy apple banana" result = re.findall(pattern, text) print(result) # 輸出: ['happy', 'apple', 'banana'] # 嵌入條件匹配:使用 (?if:...) 來實現(xiàn)條件匹配??梢愿鶕?jù)條件選擇不同的模式進行匹配: pattern = r'(?i)(?:(?<=Mr\.)|(?<=Ms\.)|(?<=Mrs\.))\s\w+' text = "Hello Mr. Smith, Ms. Johnson, and Mrs. Davis" result = re.findall(pattern, text) print(result) # 輸出: ['Smith', 'Johnson', 'Davis'] # 后向引用斷言:使用 (?<=(...)) 來實現(xiàn)后向引用斷言,即在匹配的位置之前必須滿足某個條件: pattern = r'\b(\w+)\b(?<=(ing))' # 匹配以 "ing" 結尾的單詞中的前面部分 text = "running jumping swimming" result = re.findall(pattern, text) print(result) # 輸出: ['runn', 'jump'] # 零寬負向斷言:使用 (?<!...) 來實現(xiàn)零寬負向斷言,即在當前位置之前不能滿足某個條件: pattern = r'(?<!un)\b\w+\b' # 匹配不以 "un" 開頭的單詞 text = "happy unhappy apple banana" result = re.findall(pattern, text) print(result) # 輸出: ['happy', 'apple', 'banana'] # 非打印字符:可以使用轉義序列來匹配非打印字符,如制表符 \t、換行符 \n 等: pattern = r'abc\tdef\nghi' text = "abc\tdef\nghi" result = re.findall(pattern, text) print(result) # 輸出: ['abc\tdef\nghi'] # 貪婪與非貪婪匹配:在重復模式中,默認情況下是貪婪匹配,盡可能多地匹配。但可以使用 ? 來指定非貪婪匹配,盡可能少地匹配: s = "aaaabaaaa" pattern = r'a.*a' # 貪婪匹配模式 match = re.search(pattern, s) if match: print(match.group()) # 輸出:'aaaabaaaa' s = "aaaabaaaa" pattern = r'a.*?a' # 非貪婪匹配模式 match = re.search(pattern, s) if match: print(match.group()) # 輸出:'aaa'
總結
到此這篇關于Python控制臺獲取輸入與常見的正則表達式用法的文章就介紹到這了,更多相關Python控制臺獲取輸入與正則表達式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python3 googletrans超時報錯問題及翻譯工具優(yōu)化方案 附源碼
這篇文章主要介紹了python3 googletrans超時報錯問題及翻譯工具優(yōu)化方案 附源碼,本文給大家分享解決方法,通過實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下2020-12-12Python實時監(jiān)控網(wǎng)站瀏覽記錄實現(xiàn)過程詳解
這篇文章主要介紹了Python實時監(jiān)控網(wǎng)站瀏覽記錄實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07解決導入django_filters不成功問題No module named ''django_filter''
這篇文章主要介紹了解決導入django_filters不成功問題No module named 'django_filter',具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07使用wxPython和Pandas實現(xiàn)XLSX分析器和網(wǎng)頁打開器
這篇文章主要為大家詳細介紹了如何使用wxPython和Pandas實現(xiàn)XLSX分析器和網(wǎng)頁打開器,文中的示例代碼講解詳細,感興趣的可以了解一下2024-10-10Windows上安裝tensorflow 詳細教程(圖文詳解)
這篇文章主要介紹了Windows上安裝TENSORFLOW 詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02