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



我正在使用正则表达式来识别学生文件中的名字。名称包含前缀,例如"MR"或"MRS",或者没有只有前缀的名称,例如"乔治 51 先生"或"乔治 52 夫人"或"乔治 53"。我只想从这三个(最后一个(中的"GEORGE 53"中提取 53,这意味着不应该出现"乔治 51 先生"或"乔治 52 夫人"。注意:数字可以改变,它是一个年龄。

确实知道正则表达式,并且我尝试了像"[^M][^R]"[^M][^R][^S]"这样的模式来识别和提取年龄,只有当没有"MR"或"MRS"应该作为字符串中的前缀时。我知道通过python程序,我可以通过某些条件来实现这一点,但我确实想知道是否有任何正则表达式可用于做同样的事情。

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

您可以使用

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

请参阅正则表达式演示。要将名称和年龄抓取到单独的元组项目中,请捕获它们:

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

  • b - 字边界
  • (?<!bmrs) - 当前位置之前没有mr + 空格
  • (?<!bmrss) - 当前位置之前没有mrs + 空格
  • (S+) - 组 1:一个或多个非空格字符
  • s+ - 1+ 空格
  • (d{1,2}) - 第 2 组:一位或两位数
  • b - 字边界

re.I是不区分大小写的修饰符。

蟒蛇演示:

import re
text="for an example 'MR GEORGE 51' or 'MRS GEORGE 52' or 'GEORGE 53'"
print(re.findall(r'b(?<!bmrs)(?<!bmrss)S+s+d{1,2}b', text, re.I))
# => ['GEORGE 53']
print(re.findall(r'b(?<!bmrs)(?<!bmrss)(S+)s+(d{1,2})b', text, re.I))
# => [('GEORGE', '53')]

最新更新