首页 > 解决方案 > 使用正则表达式时我无法排斥(过滤)小写名字

问题描述

堆栈溢出的好前辈,我一直在尝试编写一个正则表达式,它可以输出以随机名字和 Nakamoto 作为姓氏的名字。

像这些:

Yoshida Nakamoto
Yukari Nakamoto
Hey Nakamoto

不是这些:

yoshida Nakamoto
Nakamoto
Y2D Nakamoto

问题是,我试图过滤掉那些使用小写名字的人。

我试过了:

[A-Z]+
[^A-Z]
[^A-Z]{1}

但总是失败,输出有所不同,但没有像我预期的那样。

#! python3
# nameRex.py
# this is a regular expression to find out those have Nakamoto as family name.


import pprint, re

matches = []

nameList = ['Saoshi Nakamoto',
            'Alice Nakamoto',
            'RoboCop Nakamoto',
            'satoshi Nakamoto',
            'Mr. Nakamoto',
            'Nakamoto',
            'Satoshi nakamoto',
            'Y2D Nakamoto']

nakamotoOrNot = re.compile(r'''
    [^A-Z]{1}
    (\w+)
    (\s)?
    (Nakamoto)
    ''',  re.VERBOSE)

for groups in nakamotoOrNot.findall(str(nameList)):
    matches.append(groups)

pprint.pprint(matches)

如上,预期的结果是:

[('Saoshi', ' ', 'Nakamoto'),
 ('Alice', ' ', 'Nakamoto'),
 ('RoboCop', ' ', 'Nakamoto')]

但实际结果是:

[('Saoshi', ' ', 'Nakamoto'),
 ('Alice', ' ', 'Nakamoto'),
 ('RoboCop', ' ', 'Nakamoto'),
 ('satoshi', ' ', 'Nakamoto')] # This thing just won't go away!!!!

帮助!!

标签: pythonregex

解决方案


你可以试试这个,关键指针在这里:

  1. 完全匹配字符串
  2. 以大写开头
  3. 名字中只包含字母
  4. 姓是中本

顺便说一下,我建议你将list中的字符串一一比较,不要将list转换为str,构建新字符串的成本更高,而且很难使用fullmatch。

matches = []

nameList = ['Saoshi Nakamoto',
            'Alice Nakamoto',
            'RoboCop Nakamoto',
            'satoshi Nakamoto',
            'Mr. Nakamoto',
            'Nakamoto',
            'Satoshi nakamoto',
            'Y2D Nakamoto']

nakamotoOrNot = re.compile('[A-Z][a-zA-Z]+ Nakamoto')

for name in nameList:
    if nakamotoOrNot.fullmatch(name):
        matches.append(name)

print(matches)

输出: ['Saoshi Nakamoto', 'Alice Nakamoto', 'RoboCop Nakamoto']

希望对您有所帮助,如果您还有其他问题,请发表评论。:)


推荐阅读