代码之家  ›  专栏  ›  技术社区  ›  BKS

捕获第一个单词和最后一个单词的第一个字母的正则表达式

  •  0
  • BKS  · 技术社区  · 6 年前

    我对正则表达式还不太熟悉,我正试图找出如何在数据帧中生成一个新列,该列捕获名称的首字母和姓氏。

    例子 df :

    Name           NormName
    john smith     j smith
    s r peterson   s peterson
    sandra oh      s oh
    

    这是我迄今为止尝试过的代码,但似乎无法使其生效。我不知道怎么让它只替换中间部分。

    namereg = re.compile('(^[a-z])(.*)(\s[a-z]*$)')
    names['NormName'] = names.Name.apply(lambda tmp: namereg.sub('',tmp))
    
    4 回复  |  直到 6 年前
        1
  •  5
  •   MegaIng Mischa Lisovyi    6 年前

    我想你甚至不需要使用regex:

    names['NormName'] = names.Name.apply(lambda tmp: tmp[0]+" "+tmp.rpartition(" ")[2])
    
        2
  •  1
  •   Wiktor Stribiżew    6 年前

    这应该可以,请根据需要调整它。

    import re
    name="john smith"
    PATTERN=r'^(\w).*(\s+\w+)$'
    MATCH=re.search(PATTERN, name)
    print(MATCH.group(1)+MATCH.group(2)
    
        3
  •  0
  •   Wiktor Stribiżew    6 年前

    您可以使用

    names['NormName'] = names['Name'].str.replace(r'^([a-z]).*\s([a-z]+)$', r'\1 \2')
    

    regex demo .

    图案细节

    • ^ -字符串开头
    • ([a-z]) -第1组(与 \1 替换模式中的placeholer):一个小写的ascii字母
    • .*\s -最后一个空格之前的任何0+字符
    • ([a-z]+) -第2组(与 \2 替换模式中的placeholer):1+小写ascii字母,位于…
    • $ -绳子的末端。

    Python演示:

    >>> names['NormName'] =  names['Name'].str.replace(r'^([a-z]).*\s([a-z]+)$', r'\1 \2')
    >>> names
               Name    NormName
    0    john smith     j smith
    1  s r peterson  s peterson
    2     sandra oh        s oh
    
        4
  •  0
  •   Shenglin Chen    6 年前

    尝试使用re.sub.here^(\w)第一个字母,(\b\w+\b$)最后一个单词。

    df['NormName']=df.Name.apply(lambda x: re.sub(r'^(\w).*(\b\w+\b$)',r'\1 \2',x))