2014-10-08 55 views
2

我有一個正則表達式的一個簡單的問題是推動我瘋了:簡單的regex找到兩個詞

sentence="Dr. Peter is a great man. Dr. med. Lumpert Mercury is a great man." 
    for m in re.finditer("(Dr\.|med\.)\s([A-Z][a-z]+)", sentence): 
      print '%02d-%02d: %s' % (m.start(), m.end(), m.group(2)) 

此代碼給了我一個字符串「博士」之後所有的字或「med。」如果這個詞以大寫開頭。 現在我需要輸出字符串後的兩個單詞。只有當他們以資本開始時,他們纔會再次。我嘗試了一些東西,如:

for m in re.finditer("(Dr\.|med\.)\s(([A-Z][a-z]+)|([A-Z][a-z]+)\s([A-Z][a-z]+))", sentence): 
      print '%02d-%02d: %s' % (m.start(), m.end(), m.group(2, 3)) 

你看我是怎麼打結的。我怎樣才能達到「Lumpert水星」,而且「彼得」?

現在我需要兩個,一個字或兩個字後「博士」和「med。」。

我需要得到 「Peter」和「Lumpert Mercury」。

回答

2

使用非捕獲組,使其在原始捕獲組內可選。

>>> import re 
>>> s = "Dr. Peter is a great man. Dr. med. Lumpert Mercury is a great man." 
>>> for m in re.finditer("(?:Dr|med)\.\s*([A-Z][a-z]+(?: [A-Z][a-z]+)?)", s): 
...  print '%02d-%02d: %s' % (m.start(), m.end(), m.group(1)) 

00-09: Peter 
30-50: Lumpert Mercury 
+0

謝謝,這工作。我編輯了一下,所以我可以添加更多的字符串。謝謝! – 2014-10-08 18:20:06

1

您需要使用以下regular expression: -

(?:Dr|med)\.\s*([A-Z][a-z]*)