我正在使用正则表达式从学生档案中识别姓名。名称包含前缀,例如“ 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程序,我可以在某种条件下实现此目标,但我确实想知道是否有任何正则表达式可用于执行相同操作。
答案 0 :(得分:1)
[^M][^R]
模式匹配除M
以外的任何字符,后跟除R
之外的任何字符。因此,例如,如果有效匹配为SR
或ME
,您实际上可能会拒绝。
您可以使用
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
是不区分大小写的修饰符。
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')]