如何在空格、特殊字符前后提取字符串?

2024-09-21 00:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧“trial\u 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”,因为它只有一个字符串。同样地,“露露”将和它已经只有的两条弦一样。你知道吗

最终输出:

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多万行,所以它循环了那么多次,这非常耗时。 有没有一个非常好的优化方法来解决我的需求?你知道吗


Tags: 数据字符串dfifnamescolmaxat
2条回答
 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

我们可能希望在这里设计的表达方式相当复杂。也许,最好将任务分解,然后设计更简单的表达式。例如,THE LULU在我们通过regex引擎运行它之前,可以简单地排除这种情况。你知道吗

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

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

但是,我敢肯定,它不会在其他一些输入,我们可能已经和这里没有列出的工作。你知道吗

DEMO


这个想法有三个步骤:

  • 我们把那些很容易找到/过滤掉的,比如“露露”
  • 我们添加了一个具有最多边界的捕获组^([A-Z\s]{3,}?)
  • 我们添加另一组子表达式,这些子表达式与逻辑OR相连接,并在字符串的末尾过滤出我们想要的内容。你知道吗

enter image description here

相关问题 更多 >

    热门问题