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)

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。