python数据清洗excel表格中的特殊字符
一、Unicode在python中的应用
1、Unicode
Unicode标准中的每个字符都有唯一的Unicode码点,通常以U+开头,后跟4至6个十六进制数字。比如,U+2022代表一个特定字符。
Unicode范围是一系列连续的Unicode码点的集合,例如U+2600-U+27EF表示从U+2600到U+27EF之间的所有字符。
2、Unicode转义序列
python中提供了多种形式的Unicode转义序列,如\U、\N、\u。\U后跟8个十六进制数字,表示一个Unicode编码的字符;\N{}中间包含一个Unicode字符的名称,表示相应的字符。些不同的转义格式可以根据具体的需求选择使用。本文主要使用\u。
在python中,使用r’\uXXXX’格式可以表示一个Unicode码点,其中XXXX是该字符对应的十六进制数。例如,r’\u2022’表示Unicode码点为U+2022的字符。通过将多个这样的转义序列连接起来,可以构成一个表示多个Unicode字符的正则表达式模式,比如,r’\u2022\ufecc\ufe8e’。这种转义序列可以用于包含非 ASCII字符的字符串,使其在代码中得到正确表示。
下面是一些常见的Unicode转义序列示例:
- \u0041: 表示大写字母"A"(U+0041)。
- \u00A9: 表示版权符号"©"(U+00A9)。
- \u4E2D\u6587: 表示两个Unicode字符,分别是"中"(U+4E2D)和"文"(U+6587),可以合并成一个中文字符串"中文"。
- 在Python中,Unicode转义序列可以用于字符串字面量、正则表达式模式以及其他需要表示Unicode字符的地方。
二、关于正则表达式的应用
1、解读python中前缀为r的字符串
在Python中,前缀为r的字符串(例如r’string’)是一种原始字符串(raw string)的表示方式。
原始字符串是一种特殊的字符串表示形式,在其中转义字符(如\n、\t等)不会被特殊处理,而是作为普通字符直接被包含在字符串中。这意味着反斜杠字符\不会被解释为转义字符,而是作为普通的反斜杠字符进行处理。例如,
string1 = ‘Hello\nWorld’
string2 = r’Hello\nWorld’
在string1中,\n被解释为换行符,字符串将在Hello和World之间换行。而在string2中,\n被视为普通的两个字符,所以字符串将保留字面的\n。
原始字符串在处理一些特殊字符序列或正则表达式时非常有用,因为它们使得字符串的内容更加清晰明确,不会受到转义字符的干扰。同时,原始字符串也可以用于表示Unicode转义序列,如r’\uXXXX’。
2、常见的元字符及其含义
在正则表达式中,有一些字符和符号有特殊含义,它们被称为元字符(metacharacters),用于表示匹配文本的规则。以下是一些常见的元字符及其含义:
.:匹配任意单个字符(除了换行符)。
^:匹配字符串的开头。
$:匹配字符串的结尾。
*:匹配前面的内容零次或多次。
+:匹配前面的内容一次或多次。
?:匹配前面的内容零次或一次。
{m}:匹配前面的内容恰好出现m次。
{m,}:匹配前面的内容至少出现m次。
{m,n}:匹配前面的内容出现m到n次。
[]:匹配方括号中列举的任意一个字符。
[^…]:匹配除了方括号中列举的字符以外的任意字符。
[a-z]:匹配小写字母a到z中的任意一个字符。
[A-Z]:匹配大写字母A到Z中的任意一个字符。
\d:匹配任意一个数字。
\D:匹配任意一个非数字字符。
\s:匹配任意一个空白字符(包括空格、制表符、换行符等)。
\S:匹配任意一个非空白字符。
\w:匹配任意一个字母、数字或下划线。
\W:匹配任意一个非字母、数字或下划线字符。
需要注意的是,如果想要匹配这些元字符本身,需要使用反斜杠进行转义,例如.表示匹配点号本身。
3、常见的正则表达式函数
- re.search(pattern, string, flags=0)
在字符串中搜索符合正则表达式 pattern 的第一个子串,并返回一个包含匹配信息的 Match 对象。如果没有匹配到,则返回 None。 - re.match(pattern, string, flags=0)
从字符串的开始位置开始匹配符合正则表达式 pattern 的第一个子串,并返回一个包含匹配信息的 Match 对象。如果没有匹配到,则返回 None。 - re.findall(pattern, string, flags=0)
在字符串中查找符合正则表达式 pattern 的所有子串,并以列表形式返回这些子串。 - re.sub(pattern, repl, string, count=0, flags=0)
使用正则表达式 pattern 在字符串中查找匹配项,并将它们替换为 repl。可选参数 count 指定最多替换的次数。 - re.split(pattern, string, maxsplit=0, flags=0)
使用正则表达式 pattern 将字符串分割成多个子串,并以列表形式返回这些子串。
三、实际代码操作
由于根据不同实际需求,需要处理的特殊字符不同,本文分开使用了三个函数处理,按实际需求也可合并在一起。
import pandas as pd
import re
# 步骤1:确定remove_characters的3个函数用于分别剔除characters中包含的特殊符号,其中包括动画小表情、斜杆冒号表情;此类表情:•ﻌ•由多个 Unicode 字符组成本文档仅解决了这个表情,[微笑]
def remove_characters1(text):
characters = ['#E-s\d{2}', '%\d+', '/:\d{3}', '/:(/w*)', '/:-([A-Za-z]+)', '[\U00010000-\U0010ffff]', '\*&\*']
# '|'.join(characters) 表示将列表 characters 中的字符串元素以 '|' 符号连接起来,形成一个新的字符串。
# 如假设 characters 是一个包含多个字符的列表:['a', 'b', 'c'] 将会返回一个新的字符串 'a|b|c'
patterns = '|'.join(characters)
processed_text = re.sub(patterns, '', text)
return processed_text
# 步骤2:确定remove_ac函数能剔除punctuation中包含的字符以及符合pattern格式的内容,其中包括由以下字符组成的颜文字及例子:[难过]
def remove_characters2(desstr):
punctuation = '""\##*$$%&'\'().^_^*+-/:;<=><>@[\]^_`{|}~⦅⦆「」、\u3000、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔\\\·?!\-·`'
tr = re.sub('[{}]'.format(punctuation), "", desstr)
pattern = r"\[[^\[\]]*\]" # 匹配包含中括号的内容
# 使用正则表达式将匹配到的内容即例如[微笑]替换为空字符串
r = re.sub(pattern, "", tr)
return r
# 步骤3:确定remove_ac函数能剔除punctuation中包含的字符,主要解决特殊字符表情问题,还需根据实际应用修改,可在以下pattern中补充Unicode即可,具体颜文字Unicode写法可在chat中询问
def remove_characters3(desstr1):
pattern = re.compile(r'[\u2022\ufecc\ufe8e\u2764]')
processed_text = re.sub(pattern, '', desstr1)
return processed_text
# 步骤4:读取文件,实际使用需修改以下文件路径/文件名
# 读取Excel文件
df = pd.read_excel('data_try.xlsx')
# 步骤5:新建列,列名为New Column,此处为对第一列数据应用处理函数,依次使用以上三个自定义函数
df['New Column'] = df.iloc[:, 0].apply(remove_characters1)
df['New Column'] = df.iloc[:, 2].apply(remove_characters2)
df['New Column'] = df.iloc[:, 2].apply(remove_characters3)
# 步骤6:输出处理后的数据到新列,保存文档
df.to_excel('data_try.xlsx', index=False)