首页 > 解决方案 > 如何在空格,特殊字符之前和之后提取字符串?

问题描述

我有一个数据框“trial_df”,其列值如下:

Names

GHAITHA & AL MOOSA
ASEEL ELECTRONICS T
SUNRISE SUPERMARKET-QU
EMARAT-AL SAFIYAH(6735
LULU CENTRE LLC EFT TE
MAX
THEMAX
THE LULU
GHAITHA 123
SUNRISE %$#

要求 :

1) 只提取空格前后的字符串,特殊字符。

例如:“ASEEL ELECTRONICS T”将变为“ASEEL ELECTRONICS

2)但仅在以下条件下:

a) 第二个字符串长度应大于 2

b) 第二个字符串应该是字母数字

例如:'GHAITHA & AL MOOSA' 将只是 'GHAITHA',因为空格是 '&' 之后的第二个字符串(两个条件都失败:不是字母数字且长度不大于 2)

例如:'MAX' 将是 'MAX' 作为其唯一的一个字符串。同样,'THE LULU' 将与它已经只有 2 个字符串相同。

最终输出:

Names

GHAITHA
ASEEL ELECTRONICS
SUNRISE SUPERMARKET-QU
EMARAT
LULU CENTRE
MAX
THEMAX
THE LULU
GHAITHA
SUNRISE

我做这个要求的功能:

def remove_strings(df, col):
    for i in df.index:
        x = df.at[i, col]
        x = x.split(' ')
        if len(x) > 1:
            if len(x[1]) > 2:
                x[1] = ''.join(e for e in x[1] if e.isalnum())
                x = ' '.join(x[0:2])
                df.at[i, col] = x
            else:
                df.at[i, col] = x[0]
        else:
            df.at[i, col] = df.at[i, col]

#calling my function 
remove_strings(df=trial_df, col='Names')

我的功能问题:虽然它解决了要求,但没有得到很好的优化。我的数据超过 100 万行,所以它循环了很多次,非常耗时。有没有很好的优化方法来解决我的要求?

标签: pythonregexpython-3.xstringregex-group

解决方案


我们可能希望在这里设计的表达式非常复杂。也许,最好将任务分解,然后我们会设计更简单的表达式。例如,THE LULU在我们通过正则表达式引擎运行它之前,可以简单地排除大小写。

我对表达式的部分尝试是:

^([A-Z\s]{3,}?)(&.+|\s[A-Z]{1}$|-.+|\s[A-Z]{3}\s.+|\s[0-9].+|\s[~!@#$%^&*]+.+)$

但是,我很确定它不适用于我们可能拥有但未在此处列出的其他一些输入。

演示


这个想法将分为三个步骤:

  • 我们选择那些容易找到/过滤掉的,比如“THE LULU”
  • 我们添加一个具有最多边界的捕获组^([A-Z\s]{3,}?)
  • 我们添加另一个包含与逻辑 OR 连接的子表达式的组,并在字符串末尾过滤掉我们希望出现的内容。

在此处输入图像描述


推荐阅读