在我的作業中,我需要使用 Regex 從給定字串中提取一個人的名字、姓氏、ID 代碼、電話號碼、出生日期和地址。引數的順序始終保持不變。每個引數都需要一個單獨的模式。
要求如下:
- 名字和姓氏總是以大寫字母開頭,后跟至少一個小寫字母。
- ID 代碼的長度始終為 11 個字符,并且僅包含數字。
- 電話號碼本身是 7-8 個數字的組合。電話號碼可以用空格與區號隔開,但不一定。也有可能根本沒有區號。
- 出生日期的格式為 dd-MM-YYYY
- 地址就是剩下的一切。
我得到了每個引數的以下模式:
str1 = "HeinoPlekk69712047623 3725688736412-09-2020Tartu mnt 183,Tallinn,16881,Eesti"
first_name_pattern = r"^[A-Z][a-z] "
last_name_pattern = r"[A-z][a-z] (?=[0-9])"
id_code_pattern = r"\d{11}(?=\ )"
phone_number_pattern = r"\ \d{3}?\s*\d{7,8}"
date_pattern = r"\d{1,2}\-\d{1,2}\-\d{1,4}"
address_pattern = r"[A-Z][a-z]*\s.*$"
first_name_match = re.findall(first_name_pattern, str1)
last_name_match = re.findall(last_name_pattern, str1)
id_code_match = re.findall(id_code_pattern, str1)
phone_number_match = re.findall(phone_number_pattern, str1)
date_match = re.findall(date_pattern, str1)
address_match = re.findall(address_pattern, str1)
所以,鑒于"HeinoPlekk69712047623 3725688736412-09-2020Tartu mnt 183,Tallinn,16881,Eesti",我得到['Heino'] ['Plekk'] ['69712047623'] [' 372 56887364' ] ['12-09-2020'] ['Tartu mnt 183,Tallinn,16881,Eesti'],這非常適合我。
問題從缺少區號開始,因為現在id_code_pattern找不到 id 代碼(?=\ ),如果嘗試使用|\d{11}(或)還有另一個問題,因為現在它找到了 id 代碼和電話號碼(69712047623 和 37256887364) . 以及如何改進phone_number_pattern,使其只能找到 7 或 8 位電話號碼,我不明白。
uj5u.com熱心網友回復:
帶有一些精心設計的捕獲組的單個運算式將極大地幫助您:
import re
str1 = "HeinoPlekk69712047623 3725688736412-09-2020Tartu mnt 183,Tallinn,16881,Eesti"
pattern = r"^(?P<first_name>[A-Z][a-z] )(?P<last_name>[A-Z][a-z] )(?P<id_code>\d{11})(?P<phone>(?:\ \d{3})?\s*\d{7,8})(?P<dob>\d{1,2}\-\d{1,2}\-\d{1,4})(?P<address>.*)$"
print(re.match(pattern, str1).groupdict())
復制| 正則運算式101
結果:
{'first_name': 'Heino', 'last_name': 'Plekk', 'id_code': '69712047623', 'phone': ' 37256887364', 'dob': '12-09-2020', 'address': 'Tartu mnt 183,Tallinn,16881,Eesti'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/519987.html
上一篇:多行文本區域的正則運算式
