如何提取空格,特殊字符前后的字符串?

时间:2019-05-27 21:07:47

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

我有一个数据框“ 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')

我的功能有问题:虽然可以解决要求,但优化效果不佳。 我的数据超过一百万行,因此它循环很多次非常耗时。 有没有一种很好的优化方法来解决我的要求?

2 个答案:

答案 0 :(得分:0)

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

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

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

但是,我非常确定它在我们可能没有在此处列出的其他输入中不会起作用。

DEMO


该想法将分三个步骤:

  • 我们采用那些易于查找/过滤的内容,例如“ THE LULU”
  • 我们添加了一个边界数量最多的捕获组^([A-Z\s]{3,}?)
  • 我们添加另一个带有与逻辑OR关联的子表达式的组,并过滤​​掉希望在字符串末尾显示的内容。

enter image description here

答案 1 :(得分:0)

 df.Names.replace(regex=r'^(\w+)(\s[A-Z-]{2,})?.*',value=r'\1\2')
Out[186]: 
0                   GHAITHA
1         ASEEL ELECTRONICS
2    SUNRISE SUPERMARKET-QU
3                    EMARAT
4               LULU CENTRE
5                       MAX
6                    THEMAX
7                  THE LULU
8                   GHAITHA
9                   SUNRISE
Name: Names, dtype: object