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

正则表达式使用特殊字符(破折号、撇号)分割名称

正则表达式使用特殊字符(破折号、撇号)分割名称

饮歌长啸 2023-09-05 15:45:26
我有一个包含姓名的列,它们都是串联的(也就是说,名字和姓氏之间没有空格)。我正在尝试拆分名字和姓氏,该网站上已经询问过这个问题。然而在这里,有些名称带有破折号\-或撇号\'。Speed-WagonMario CruiserPetey SthesiaAnna De’wayneJohn我想确保它被我的正则表达式查询捕获:clean_names = re.split(r'([A-Z][a-z\']+\-[A-Z][a-z\']+|[A-Z][a-z\']+)', names)它适用于破折号,破折号仅出现在大写字母之前,但不适用于撇号。有人对如何解决我的查询有意见吗?提前致谢
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以将正向lookbehind(小写)与正向lookahead(大写)结合起来。两个匹配的环视在拆分时都会保留。


/           // BEGIN EXPRESSION

(?<=[a-z])  // POSITIVE LOOKBEHIND [a-z]

(?=[A-Z])   // POSITIVE LOOKAHEAD  [A-Z]

/           // END EXPRESSION

Python 示例

#!/usr/bin/env python3


import re


def pair_to_person(pair):

  person = {}

  person['firstName'] = pair[1]

  person['lastName'] = pair[0]

  return person


def parse_name_column(column_text):

  return map(pair_to_person,

    map(lambda name: re.split(r'(?<=[a-z])(?=[A-Z])', name),

      map(lambda x: x, column_text.strip().split('\n'))))


print_list = lambda list: print('\n'.join(map(str, list))) 


if __name__ == '__main__':

  column_text = '''

Speed-WagonMario

CruiserPetey

SthesiaAnna

De’wayneJohn

'''


  names = parse_name_column(column_text)


  print_list(names)

输出

{'firstName': 'Mario', 'lastName': 'Speed-Wagon'}

{'firstName': 'Petey', 'lastName': 'Cruiser'}

{'firstName': 'Anna', 'lastName': 'Sthesia'}

{'firstName': 'John', 'lastName': 'De’wayne'}

JS 示例

const data = `

Speed-WagonMario

CruiserPetey

SthesiaAnna

De’wayneJohn

`;


const names = data.trim().split('\n')

  .map(name => name.trim().split(/(?<=[a-z])(?=[A-Z])/))

  .map(pair => ({ firstName: pair[1], lastName: pair[0] }));


console.log(names);

.as-console-wrapper { top: 0; max-height: 100% !important; }


查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

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