python - 如何在空格,特殊字符之前和之后提取字符串?
问题描述
我有一个数据框“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 万行,所以它循环了很多次,非常耗时。有没有很好的优化方法来解决我的要求?
解决方案
我们可能希望在这里设计的表达式非常复杂。也许,最好将任务分解,然后我们会设计更简单的表达式。例如,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 连接的子表达式的组,并在字符串末尾过滤掉我们希望出现的内容。
推荐阅读
- asp.net - 在循环中执行存储过程是否有更有效的替代方法?
- unity3d - 在 Oculus Quest build 7.0 上无法同时对两个控制器进行跟踪
- python - 如何将给定的字符串转换为数组?
- python - 我们在 OpenCV 和 Python 中有椭圆检测吗?
- python - 计算任何格式的电影剧本中每个角色说的单词数
- django - 在 django 问题中使用 AJAX 自动填充下拉列表
- javascript - 我可以使用 ASCII 检查密码是否由数字组成吗?
- python - Python For Loop using List - 尝试根据循环中使用的最后一个数字对数字对进行分组
- r - 闪亮的输入 - 如果全部选中,则显示所有数据并绘制汇总数据
- docker - 创建能够从容器注册表中提取的 docker 就绪计算引擎