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

迭代字符串并将模式移动到每个列表元素的开头

  •  0
  • id345678  · 技术社区  · 2 年前

    我有一份清单 names 有头衔的 Dr. 在错误的地方。

    因此我想

    • 在列表元素上循环以替换 Dr., 博士 具有
    • 同时添加/移动 Dr. 到相应字符串的开头。

    我的成绩相当令人失望。是 re.sub() 哪怕是正确的方法?

    names = ['Johnson, Dr., PWE', 'Peterson, FDR', 'Gaber, Dr. GTZ']
    for idx, item in enumerate(names):
        names[idx] = re.sub(r' Dr.(,)? ', ' Dr. ', item)
    print(names)
    ['Johnson, Dr. PWE', 'Peterson, FDR', 'Gaber, Dr. GTZ']
    

    desired_names = ['Dr. Johnson, PWE', 'Peterson, FDR', 'Dr. Gaber, GTZ']
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   The fourth bird    2 年前

    您可以使用2个捕获组,并使用替换中恢复的组来获得正确的顺序。

    ([^,\n]+,\s*)(Dr\.),?\s*
    
    • ([^,\n]+,\s*) 捕获任何字符,除了 , 或者是一条新线 第一组 ,然后匹配逗号和可选的空格字符
    • (Dr\.) 俘虏 Dr. 在里面 第二组
    • ,?\s* 匹配可选的逗号和空格字符

    Regex demo | Python demo

    实例

    import re
    names = ['Johnson, Dr., PWE', 'Peterson, FDR', 'Gaber, Dr. GTZ']
    for idx, item in enumerate(names):
        names[idx] = re.sub(r'([^,\n]+,\s*)(Dr\.),?\s*', r'\2 \1', item)
    print(names)
    

    输出

    ['Dr. Johnson, PWE', 'Peterson, FDR', 'Dr. Gaber, GTZ']