python - 使用正则表达式时我无法排斥(过滤)小写名字
问题描述
堆栈溢出的好前辈,我一直在尝试编写一个正则表达式,它可以输出以随机名字和 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!!!!
帮助!!
解决方案
你可以试试这个,关键指针在这里:
- 完全匹配字符串
- 以大写开头
- 名字中只包含字母
- 姓是中本
顺便说一下,我建议你将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']
希望对您有所帮助,如果您还有其他问题,请发表评论。:)