【问题标题】:Regex Replacements of Gibberish in Python PandasPython Pandas 中乱码的正则表达式替换
【发布时间】:2021-11-12 18:24:58
【问题描述】:

我有一些字符串,其中一些是乱码,是数字和字母的混合体。乱码,我想删除,但那些有模式的,我想保留。

我提供一个示例用于说明目的。

strings = ["1Z83E0590391137855",
           "55t5555t5t5tttt5t5555tttttttgggggggggggggggsss",
           "1st", "2nd", "3rd", "4th", "5th"
          ]
import pandas as pd
df = pd.DataFrame(strings, columns=['strs'])
df

我想删除看起来像的字符串

1Z83E0590391137855
55t5555t5t5tttt5t5555tttttttgggggggsss

并保留如下所示的字符串

1st
2nd
3rd
4th
5th

鉴于我有限的正则表达式和 python 经验,我很难想出正确的公式。我已经尝试过,除了第一行之外,已经删除了所有内容:

df['strs'] = df['strs'].str.replace(r'(?=.*[a-z])(?=.*[\d])[a-z\d]+', '', regex=True)

【问题讨论】:

    标签: python-3.x regex pandas


    【解决方案1】:

    我建议只匹配包含一定数量字符的字母和数字的字母数字字符串。

    在下面的示例中,我将阈值设置为 18,即不匹配小于 18 个字符的字符串,因此将保留在列中。所有相等或更长的字符串都将被删除:

    df['strs'] = df['strs'].str.replace(r'^(?=.{18})(?:[a-zA-Z]+\d|\d+[a-zA-Z])[a-zA-Z\d]*$', '', regex=True)
    

    详情

    • ^ - 字符串开头
    • (?=.{18}) - 字符串必须以 18 个字符开头,而不是换行符
    • (?:[a-zA-Z]+\d|\d+[a-zA-Z]) - 一个或多个字母,然后是一个数字或一个或多个数字,然后是一个字母
    • [a-zA-Z\d]* - 零个或多个字母数字字符
    • $ - 字符串结束。

    请参阅regex demo

    【讨论】:

    【解决方案2】:

    您可以检查该行不以 1st 2nd.. 开头以仅删除这些行。

    ^(?!\d+(?:st|nd|rd|th)$).*$
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多