如何使用正则表达式避免基于前缀的字符串

时间:2019-06-14 09:24:45

标签: regex python-3.x

我正在使用正则表达式从学生档案中识别姓名。名称包含前缀,例如“ MR”或“ MRS”,或者没有仅前缀的名称,例如“ MR GEORGE 51”或“ MRS GEORGE 52”或“ GEORGE 53”。 我只想从这三个(最后一个)中的“ GEORGE 53”中提取53,这意味着不应该出现“ MR GEORGE 51”或“ MRS GEORGE 52”。注意:数字可以更改,可以是年龄。

我确实了解正则表达式,并且尝试过像[[^ M] [^ R]''[^ M] [^ R] [^ S]'这样的模式来识别和提取年龄,只有当没有'MR'时或“ MRS”应作为字符串的前缀。我了解通过python程序,我可以在某种条件下实现此目标,但我确实想知道是否有任何正则表达式可用于执行相同操作。

1 个答案:

答案 0 :(得分:1)

[^M][^R]模式匹配除M以外的任何字符,后跟除R之外的任何字符。因此,例如,如果有效匹配为SRME,您实际上可能会拒绝。

您可以使用

re.findall(r'\b(?<!\bmr\s)(?<!\bmrs\s)\S+\s+\d{1,2}\b', text, re.I)

请参见regex demo。要将名称和年龄分成单独的元组项,请捕获它们:

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')]