正则表达式在某些情况下无法正常工作 (python)?

Regex not working properly for some cases (python)?

我有一个数据框,其中一列有字符串值,另一列有整数,但这些列有特殊字符,或者字符串数据有整数。因此,为了删除它,我使用了正则表达式我的正则表达式工作正常但对于整数列,如果 'abc123' 是那么它不会删除 abc 并且与字符串列相同如果 '123abc' 在那里那么它不会删除它。不知道是模式错了还是代码错了。下面是我的代码,

d = [['abc','123'],['gbc@*','23abc'],['abc123','abc200'],['124abc','1230&*'],['abcer£$%&*!','230!?*&']]
df1= pd.DataFrame(d, columns=['str','int'])
print(df1)

   str     int
0   abc    123
1   gbc@*   23abc
2   abc123  abc200
3   124abc  1230&*
4   abcer£$%&*! 230!?*&

num = r'\d+$'
alpha = r'[a-zA-Z]+$'
wrong = df1[~df1['int'].str.contains(num, na=True)]
correct_int = [re.sub(r'([^\d]+?)', '', item) for item in wrong['int']]
print(correct_int)
wrong_str = df1[~df1['str'].str.contains(alpha, na=True)]
correct_str = [re.sub(r'([^a-zA-Z ]+?)', '', item) for item in df1['str']]
print(correct_str)

    

输出:

correct_int: ['23', '1230', '230']

如您所见,它在 '23abc','1230&*','230!?*&' 中被删除,但在 'abc200' 中没有删除,因为字符串排在第一位

correct_str: ['abc', 'gbc', 'abc', 'abc', 'abcer']

现在它已全部删除,但有时当值为 '124abc'

时它不会删除

我的模式错了吗?我也尝试过提供不同的模式,但没有任何效果

我正在删除 'str' 列中的整数和特殊字符,并删除 'int' 列中的字符串值和特殊字符 预期输出: 清理并用清理后的值替换旧值后,输出将如下所示。

    str     int
0   abc     123
1   gbc     23
2   abc     200
3   abc     1230
4   abcer   230

尝试以下操作:

  1. '\D'表示任何非数字值,将int
  2. 中的空字符串''替换掉
  3. [^a-zA-Z]表示不在a-zA-Z范围内的任何字符,用空字符串替换''str
  4. 使用 .apply()lambda 函数将这些转换应用于两列
import pandas as pd
import re

d = [['abc','123'],['gbc@*','23abc'],['abc123','abc200'],['124abc','1230&*'],['abcer£$%&*!','230!?*&']]
df1= pd.DataFrame(d, columns=['str','int'])
df1['int'] = df1['int'].apply(lambda r: re.sub('\D', '', r))
df1['str'] = df1['str'].apply(lambda r: re.sub('[^a-zA-Z]', '', r))
print(df1)

输出:

     str   int
0    abc   123
1    gbc    23
2    abc   200
3    abc  1230
4  abcer   230

你可以用

df1['str'] = df1['str'].str.replace(r"[\d\W+]", '') # replaces numbers (\d) and non-word characters (\W) with empty strings

df1['int'] = df1['int'].str.replace(r"\D+", '') # replaces any non-decimal digit character (like [^0-9])

Returns:

    str     int
0   abc     123
1   gbc     23
2   abc     200
3   abc     1230
4   abcer   230