簡體   English   中英

使用 python Regex 從字符串中提取名稱

[英]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,您可以依靠預訓練的語言模型,這些模型對常用名稱和標題有大量的了解。

  1. 步驟:設置 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()

  2. 步驟:創建 spacy 文檔doc = nlp('555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert')

  3. 步驟:獲取文檔中所有標記為 person 的標記的標簽print([(X.text, X.label_) for X in doc.ents if X.label_ == PERSON])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM