我正在使用正则表达式来识别学生文件中的名字。名称包含前缀,例如"MR"或"MRS",或者没有只有前缀的名称,例如"乔治 51 先生"或"乔治 52 夫人"或"乔治 53"。我只想从这三个(最后一个(中的"GEORGE 53"中提取 53,这意味着不应该出现"乔治 51 先生"或"乔治 52 夫人"。注意:数字可以改变,它是一个年龄。
我确实知道正则表达式,并且我尝试了像"[^M][^R]"[^M][^R][^S]"这样的模式来识别和提取年龄,只有当没有"MR"或"MRS"应该作为字符串中的前缀时。我知道通过python程序,我可以通过某些条件来实现这一点,但我确实想知道是否有任何正则表达式可用于做同样的事情。
[^M][^R]
模式匹配任何字符,但M
后跟除R
以外的任何字符。因此,例如,如果有效匹配SR
或ME
,您实际上可能会拒绝有效匹配。
您可以使用
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')]