【问题标题】:Use regex pattern to replace numbers followed by a substring or numbers followed by a space and then substring使用正则表达式替换数字后跟子字符串或数字后跟空格然后子字符串
【发布时间】:2020-09-30 14:12:36
【问题描述】:

对于 pandas 数据框中的一列,我想完整地删除任何数字,无论是紧跟“gb”或“mb”还是中间有空格。 IE。删除诸如“500 gb”和“500mb”之类的字符串。

    Column_To_Fix
0   coolblue 100gb
1   connector 500 mb for thing
2   5gb for user
3   load 800 mb
4   1000 add-on
5   20 gb 

下面的函数只适用于第0行和第2行,不知道如何添加模式的空间要求:

pat = '(^|\s)\d+(gb|mb)($|\s)'
df['Column_To_Fix'].str.lower().replace(pat, ' ', regex=True)

期望的输出:

    Column_To_Fix
0   coolblue
1   connector for thing
2   for user
3   load
4   1000 add-on
5   

【问题讨论】:

  • 数字'0''5' 在文本的第一列中吗?如果不是,我建议你删除它们。

标签: python regex pandas regexp-replace


【解决方案1】:

试试这个模式

pat = '\d+ *(gb|mb)'

df['Column_To_Fix'].str.lower().str.replace(pat, ' ')

Out[462]:
0               coolblue
1    connector   for thing
2                 for user
3                   load
4              1000 add-on
5
Name: Column_To_Fix, dtype: object

如果你喜欢series.replace

df['Column_To_Fix'].str.lower().replace(pat, ' ', regex=True)

【讨论】:

  • 您更喜欢使用“”而不是“\s”。只是想知道他们是否在任何情况下都可以表现不同。还有一个小建议..使用'(^|\s)\d+\s*(gb|mb)' 这可能会避免connector for thing 中出现额外空间
【解决方案2】:

我假设文本是(没有行号):

coolblue 100gb
connector 500 mb for thing
5gb for user
load 800 mb
1000 add-on
20 gb

并且期望的结果(保持适当的对齐和间距)是:

coolblue
connector for thing
for user
load
1000 add-on

最后一行有一个空字符串。这可以通过用空字符串替换以下正则表达式的匹配来实现(使用re.sub)。

r'(?:^\d+ ?[gm]b | \d+ ?[gm]b(?= |$))'

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多