Шаблон [^M][^R]
соответствует любому символу, кроме M
, за которым следует любой символ, кроме R
.Таким образом, вы можете отклонить действительные совпадения, например, SR
или ME
.
Вы можете использовать
re.findall(r'\b(?<!\bmr\s)(?<!\bmrs\s)\S+\s+\d{1,2}\b', text, re.I)
См. Демонстрационную версию regex ,Чтобы взять имя и возраст в отдельные элементы кортежа, запишите их:
re.findall(r'\b(?<!\bmr\s)(?<!\bmrs\s)(\S+)\s+(\d{1,2})\b', text, re.I)
Подробности
\b
- граница слова (?<!\bmr\s)
- без mr
+ пробел перед текущим местоположением (?<!\bmrs\s)
- без mrs
+ пробел прямо перед текущим местоположением (\S+)
- Группа 1: одинили более непробельных символов \s+
- 1+ пробелов (\d{1,2})
- Группа 2: одна или две цифры \b
- граница слова
Модификатор re.I
является регистронезависимым.
Python demo :
import re
text="for an example 'MR GEORGE 51' or 'MRS GEORGE 52' or 'GEORGE 53'"
print(re.findall(r'\b(?<!\bmr\s)(?<!\bmrs\s)\S+\s+\d{1,2}\b', text, re.I))
# => ['GEORGE 53']
print(re.findall(r'\b(?<!\bmr\s)(?<!\bmrs\s)(\S+)\s+(\d{1,2})\b', text, re.I))
# => [('GEORGE', '53')]