2014-10-08 37 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]*)