我对正则表达式的一个快速提问让我发疯:
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))
这段代码给了我一个字符串之后的所有单词" Dr。"或" 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 Mercury"而且"彼得"?
现在我需要两个,一个字或两个字后" Dr。"和" med。"。
我需要得到 "彼得"和" Lumpert Mercury"。
答案 0 :(得分: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
答案 1 :(得分:1)
您需要使用以下regular expression
: -
(?:Dr|med)\.\s*([A-Z][a-z]*)