【问题标题】:replace words and strings pandas替换单词和字符串 pandas
【发布时间】:2019-12-30 21:16:27
【问题描述】:
    dataframe = pd.DataFrame({'Date':['This 1A1619 person BL171111 the A-1-24',
                                  'dont Z112 but NOT 1-22-2001',
                                  'mix: 1A25629Q88 or A13B ok'], 
                          'IDs': ['A11','B22','C33'],
                          }) 

           Date                                 IDs
0   This 1A1619 person BL171111 the A-1-24      A11
1   dont Z112 but NOT 1-22-2001                 B22
2   mix: 1A25629Q88 or A13B ok                  C33

我有上面的数据框。我的目标是替换所有没有连字符的混合单词/数字组合-,例如1A1619IBL171111A13B 但不是 1-22-2001A-1-24 与字母 M。我试图通过identify letter/number combinations using regex and storing in dictionary使用下面的代码

dataframe['MixedNum'] = dataframe['Date'].str.replace(r'(?=.*[a-zA-Z])(\S+\S+\S+)','M') 

但我得到了这个输出

                          Date              IDs     MixedNum
0   This 1A1619 person BL171111 the A-1-24  A11     M M M M M M M
1   dont Z112 but NOT 1-22-2001             B22     M M M M 1-22-2001
2   mix: 1A25629Q88 or A13B ok              C33     M M or M ok

当我真的想要这个输出时

                          Date              IDs     MixedNum
0   This 1A1619 person BL171111 the A-1-24  A11     This M person M the A-1-24 
1   dont Z112 but NOT 1-22-2001             B22     dont M but NOT 1-22-2001
2   mix: 1A25629Q88 or A13B ok              C33     mix: M or M ok

我也尝试了这里建议的正则表达式,但它也对我不起作用 Regex replace mixed number+strings

谁能帮我修改我的正则表达式? r'(?=.*[a-zA-Z])(\S+\S+\S+

【问题讨论】:

    标签: python regex python-3.x string pandas


    【解决方案1】:

    你可以使用

    pat = r'(?<!\S)(?:[a-zA-Z]+\d|\d+[a-zA-Z])[a-zA-Z0-9]*(?!\S)'
    dataframe['MixedNum'] = dataframe['Date'].str.replace(pat, 'M')
    

    输出:

    >>> dataframe
                                         Date  IDs                    MixedNum
    0  This 1A1619 person BL171111 the A-1-24  A11  This M person M the A-1-24
    1             dont Z112 but NOT 1-22-2001  B22    dont M but NOT 1-22-2001
    2              mix: 1A25629Q88 or A13B ok  C33              mix: M or M ok
    

    模式详情

    • (?&lt;!\S) - 空格或字符串开头应紧接在当前位置之前
    • (?:[a-zA-Z]+\d|\d+[a-zA-Z]) - 要么
      • [a-zA-Z]+\d - 1+ 个字母和一个数字
      • | - 或
      • \d+[a-zA-Z] - 1 个以上的数字和一个字母
    • [a-zA-Z0-9]* - 0+ 位数字或字母
    • (?!\S) - 空格或字符串结尾应立即跟在当前位置之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-08
      • 2015-07-03
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多