正则表达式在某些情况下无法正常工作 (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
尝试以下操作:
'\D'
表示任何非数字值,将int列 中的空字符串''
替换掉
[^a-zA-Z]
表示不在a-z和A-Z范围内的任何字符,用空字符串替换''
在 str 列
- 使用
.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
我有一个数据框,其中一列有字符串值,另一列有整数,但这些列有特殊字符,或者字符串数据有整数。因此,为了删除它,我使用了正则表达式我的正则表达式工作正常但对于整数列,如果 '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
尝试以下操作:
'\D'
表示任何非数字值,将int列 中的空字符串[^a-zA-Z]
表示不在a-z和A-Z范围内的任何字符,用空字符串替换''
在 str 列- 使用
.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