簡體   English   中英

Python正則表達式跳過可選組

[英]Python Regex Skipping Optional Groups

我試圖從字符串中提取醫生的姓名和頭銜。 如果“dr”在字符串中,我希望它將其用作標題,然后使用下一個單詞作為醫生的名字。 但是,我還希望正則表達式與其中沒有“dr”的字符串兼容。 在這種情況下,它應該只匹配第一個單詞作為醫生的名字,並假設沒有標題。

我想出了以下正則表達式模式:

pattern = re.compile('(DR\\.? )?([AZ]*)', re.IGNORECASE)

據我了解,這應該可選地匹配字母“dr”(有或沒有下一個句號)然后是一個空格,后跟一系列字母,不區分大小寫。 問題是,如果它位於字符串的開頭,它似乎只會選擇可選的“dr”標題。

import re
pattern = re.compile('(DR\.? )?([A-Z]*)', re.IGNORECASE)
test1 = "Dr Joseph Fox"
test2 = "Joseph Fox"
test3 = "Optometry by Dr Joseph Fox"
print pattern.search(test1).groups()
print pattern.search(test2).groups()
print pattern.search(test3).groups()

代碼返回:

('Dr ', 'Joseph')
(None, 'Joseph')
(None, 'Optometry')

前兩個場景對我有意義,但為什么第三個場景找不到可選的“Dr”? 有沒有辦法讓這項工作?

你看到這種行為是因為正則表達式傾向於貪婪並接受第一個可能的匹配。 因此,您的正則表達式只接受第三個字符串的第一個單詞,沒有與第一個字符匹配的字符,這是可選的。 你可以使用findall regex函數看到這個:

>>> print pattern.findall(test3)
[('', 'Optometry'), ('', ''), ('', 'by'), ('', ''), ('Dr ', 'Joseph'), ('', ''), ('', 'Fox'), ('', '')]

很明顯,'約瑟夫博士'被成功找到了,但這不是你的第一個匹配部分。

根據我的經驗,試圖強制正則表達式來表達/捕獲多個案例通常會要求不可思議的正則表達式。 特別回答你的問題,我更喜歡通過一個需要'Dr'標題的正則表達式來運行字符串,如果我沒有得到任何匹配,只需分隔空格並取第一個單詞(或者你想要獲得第一個字)。

正則表達式引擎從左到右貪婪地匹配。 換句話說:沒有“最佳”匹配,並且將始終返回第一個匹配。 您可以進行全局搜索,但請查看re.findall()

你的正則表達式基本上接受任何單詞,因此即使在使用findall之后,如果不存在dr,也很難選擇哪一個是醫生的名字。

re.IGNORECASE真的很重要嗎? 您是否只對醫生的姓名或姓名和姓氏感興趣?

我建議使用匹配兩個單詞的正則表達式,以大寫字母開頭,中間只有一個空格,之前保留可選的dr。

如果re.ignorecase非常重要,也許最好首先搜索dr,如果不成功,則將第一個單詞存儲為名稱或類似之前的建議

尋找(?<=...)語法: Python Regex

您的重新模式將如下所示:

(DR\\.? )?(?<=DR\\.? )([AZ]*)

你只是在字符串以它開頭的時候尋找Dr,你不是在搜索包含Dr.的字符串

try pattern = re.compile('(.*DR\\.? )?([AZ]*)', re.IGNORECASE)

暫無
暫無

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

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