为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式以匹配字符串中可能的名称

正则表达式以匹配字符串中可能的名称

慕斯709654 2021-03-12 06:07:52
我想从字符串中匹配可能的名称。名称应为2-4个单词,每个单词包含3个或更多字母,所有单词均大写。例如,给定以下字符串列表:Her name is Emily.I work for Surya Soft.I sent an email for Ery Wulandari.Welcome to the Link Building Partner program!我想要一个返回的正则表达式:NoneSurya SoftEry WulandariLink Building Partner目前这是我的代码:data = [   'Her name is Emily.',    'I work for Surya Soft.',    'I sent an email for Ery Wulandari.',    'Welcome to the Link Building Partner program!']for line in data:    print re.findall('(?:[A-Z][a-z0-9]{2,}\s+[A-Z][a-z0-9]{2,})', line)它适用于前三行,但不适用于最后一行。
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您可以使用:

re.findall(r'((?:[A-Z]\w{2,}\s*){2,4})', line)

它可能会添加一个尾随空格,可以用 .strip()


查看完整回答
反对 回复 2021-03-30
?
Qyouu

TA贡献1786条经验 获得超11个赞

非正则表达式解决方案:


from string import punctuation as punc

def solve(strs):

   words = [[]]

   for i,x in enumerate(strs.split()):

      x = x.strip(punc)

      if x[0].isupper() and len(x)>2:

         if words[-1] and words[-1][-1][0] == i-1:

            words[-1].append((i,x))

         else:

            words.append([(i,x)])


   names = [" ".join(y[1] for y in x) for x in words if 2 <= len(x) <= 4]

   return ", ".join(names) if names else None



data = [

   'Her name is Emily.', 

   'I work for Surya Soft.', 

   'I sent an email for Ery Wulandari.', 

   'Welcome to the Link Building Partner abc Fooo Foo program!'

]

for x in data:

   print solve(x)

输出:


None

Surya Soft

Ery Wulandari

Link Building Partner, Fooo Foo


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信