[英]Extract names from string with python Regex
我一直在嘗試從字符串中提取名稱,但似乎還沒有接近成功。
這是代碼:
string = "555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert"
regex = re.compile(r'([A-Z][a-z]+(?: [A-Z][a-z]\.)? [A-Z][a-z]+)')
print(regex.findall(string))
這是我得到的輸出:
['Moe Szyslak', 'Timothy Lovejoy', 'Ned Flanders', 'Julius Hibbert']
花哨的正則表達式需要時間來編寫並且難以維護。 在這種情況下,我傾向於保持簡單:
re.findall(r"[^()0-9-]+", string)
輸出:
['Moe Szyslak', ' ', 'Burns, C. Montgomery', ' ', 'Rev. Timothy Lovejoy', ' ', 'Ned Flanders', 'Simpson, Homer', 'Dr. Julius Hibbert']
如果空白是一個問題,我會過濾list(filter(str.strip,list))
即使是用英語提取人名也是出了名的困難。 以下正則表達式解決了您的特定問題,但在其他輸入上可能會失敗(例如,它不捕獲帶破折號的名稱):
re.findall(r"[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+", string)
#['Moe Szyslak', 'Burns, C. Montgomery', 'Timothy Lovejoy',
# 'Ned Flanders', 'Simpson, Homer', 'Julius Hibbert']
並帶有標題:
TITLE = r"(?:[A-Z][a-z]*\.\s*)?"
NAME1 = r"[A-Z][a-z]+,?\s+"
MIDDLE_I = r"(?:[A-Z][a-z]*\.?\s*)?"
NAME2 = r"[A-Z][a-z]+"
re.findall(TITLE + NAME1 + MIDDLE_I + NAME2, string)
#['Moe Szyslak', 'Burns, C. Montgomery', 'Rev. Timothy Lovejoy',
# 'Ned Flanders', 'Simpson, Homer', 'Dr. Julius Hibbert']
作為旁注,除非您計划重用它,否則無需編譯正則表達式。
這是使用零寬度環視來隔離每個名稱的一種方法:
string = "555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert"
result = re.findall(r'(?:(?<=^)|(?<=[^A-Za-z.,]))[A-Za-z.,]+(?: [A-Za-z.,]+)*(?:(?=[^A-Za-z.,])|(?=$))', string)
print(result)
['Moe Szyslak', 'Burns, C. Montgomery', 'Rev. Timothy Lovejoy', 'Ned Flanders',
'Simpson, Homer', 'Dr. Julius Hibbert']
匹配的實際模式是這樣的:
[A-Za-z.,]+(?: [A-Za-z.,]+)*
這表示匹配任何大寫或小寫字母、點或句點,后跟一個空格和一個或多個相同字符,零次或多次。
此外,我們在此模式的左側和右側使用以下環視:
(?:(?<=^)|(?<=[^A-Za-z.,]))
Lookbehind and assert either the start of the string, or a non matching character
(?:(?=[^A-Za-z.,])|(?=$))
Lookahead and asser either the end of the string or a non matching character
我正在立即提取帶有 spacy 的實例名稱的實體。 使用 spacy,您可以依靠預訓練的語言模型,這些模型對常用名稱和標題有大量的了解。
步驟:設置 spacy 並下載預訓練的英語語言模型import spacy
import en_core_web_sm nlp = en_core_web_sm.load()import spacy
import en_core_web_sm nlp = en_core_web_sm.load()
步驟:創建 spacy 文檔doc = nlp('555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert')
步驟:獲取文檔中所有標記為 person 的標記的標簽print([(X.text, X.label_) for X in doc.ents if X.label_ == PERSON])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.