python匹配文本中全角符号的两种方法

本文探讨了在处理包含全角符号的文本时,如何正确使用Python进行正则匹配。由于全角字符在utf8编码下可能与中文字节编码冲突,直接匹配可能导致错误。解决方案包括将字符串decode为unicode,或者将正则模式也转换为unicode表示。第一种方法涉及全角转半角操作,适合复杂情况;第二种方法简洁直接,适用于匹配符号种类较少的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对文本进行处理的时候经常会遇见要对括号和标点进行匹配

常见的英文(半角)符号如( ) 直接用正则匹配即可

但是遇见全角字符(中文括号、标点),直接用正则匹配会存在问题:

因为编码通常为为utf8,若直接匹配,中文括号的3字节编码会和一些中文的字节编码重复,产生意想不到的结果

若用decode转为unicode编码,则可避免产生错误结果,但也无法直接用正则匹配到

经过试验,发现一个看上去最佳的解决方法:


将字符串decode之后调用一个将全角符号转为半角符号的方法,然后处理返回的字符串

def strQ2B(ustring):
    """全角转半角"""
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code == 12288:                              #全角空格直接转换
            inside_code = 32
        elif (inside_code >= 65281 and inside_code <= 65374): #全角字符(除空格)根据关系转化
            inside_code -= 65248
        rstring += unichr(inside_code)
    return rstring

def p(s):
    s1 = strQ2B(s.decode())
    p = re.compile('[()]',re.S)
    s1 = p.sub('',s1)
    return s1


过后转念一想,这种方法本质上不就是将正则的pattern字符和目标的编码对应么 所以将正则的字符串也用unicode表示就好了啊

一试果然如此


#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf8')
import re

if __name__ == '__main__':
    s = '123(45)a啊速度(伤害)有限公司'
    ss = re.sub(u'[()()]', '', s.decode())
    print ss


总的来说 两种方法都还是有必要存在的。

第二种方法简单直接 如果能快速方便列出所有形式的待匹配符号,就果断选用第二个

反之,若待匹配的各种符号太多太繁琐,就统一转为半角再处理更好


                
<think>好的,用户问的是如何统计文本中各类符号的总数,包括标点符号。我需要仔细分析这个问题,然后给出一个清晰的步骤说明。 首先,我得明确用户的需求。统计文本中的各类符号,可能包括标点符号、数学符号、特殊字符等等。用户可能希望知道每个符号出现的次数,比如逗号出现了多少次,句号多少次,或者是否有其他特殊符号如@、#等。 接下来,我需要考虑不同的方法来实现这个统计。可能的方法包括手动统计、使用文本处理软件或者编程工具。手动统计显然效率低下,特别是对于长文本来说,所以应该推荐自动化的方法。 然后,分步骤来讲解。首先,用户需要明确要统计的符号范围,比如是否包括中英文标点、特殊符号等。不同的符号可能有不同的编码,需要统一处理。例如,中文的逗号和英文的逗号是不同的字符,需要分别统计还是合并?这个问题需要用户自己决定。 接下来,使用文本处理工具。比如,Word的查找替换功能可以统计特定字符的出现次数,但逐个操作会比较麻烦。Excel可能需要将文本拆分成单个字符,然后使用公式统计。这两种方法对于大量文本来说可能不够高效。 然后是编程方法Python是一个常用的工具,可以编写脚本快速处理。使用Python的话,可以用字典来记录每个字符及其出现次数。需要遍历文本中的每个字符,判断是否是符号,然后累加计数。这里的关键是如何定义“符号”,可能需要用户自己定义符号集合,或者根据Unicode范围来判断。例如,标点符号在Unicode中有特定的区块,可以用正则表达式匹配。 另外,需要注意文本的编码问题,确保读取文本时使用正确的编码方式,避免乱码。还有处理大文件时的性能问题,可能需要逐行读取而不是一次性加载整个文件。 最后,测试和验证。提供示例代码,并建议用户测试,比如用一段示例文本运行脚本,查看输出是否正确。同时提醒用户根据实际需求调整符号的范围,比如是否需要排除字母和数字,只统计特定类型的符号。 总结下来,步骤应该是:1. 确定符号范围;2. 选择工具(手动、软件、编程);3. 编写代码或使用工具处理;4. 验证结果。需要详细说明每个步骤,尤其是编程方法,因为这是最有效的方式。</think>统计文本中各类符号的总数(含标点符号)可分为以下步骤: --- ### 一、明确符号范围 1. **定义符号集合** 包括但不限于: - 中文标点:`。,、;:!?「」《》【】“”‘’` - 英文标点:`.,;:!?()[]{}"'` - 数学符号:`+-×÷=≈≠<>≤≥^√` - 特殊符号:`@#$%&*~|\/` --- ### 二、选择工具方法 #### 方法1:手动统计(短文本适用) 1. 使用文本编辑器(如记事本)的查找功能(Ctrl+F) 2. 逐个输入符号,记录出现次数 #### 方法2:编程统计(推荐) 以Python为例: ```python from collections import defaultdict def count_symbols(text): symbol_counts = defaultdict(int) for char in text: if not char.isalnum(): # 排除字母和数字 symbol_counts[char] += 1 return symbol_counts # 示例用法 text = "你好!这是一段示例文本,包含逗号、句号。还有特殊符号@#" result = count_symbols(text) for symbol, count in result.items(): print(f"符号 '{symbol}' 出现次数:{count}") ``` #### 方法3:使用文本处理工具 - **Excel**:将文本拆分为单个字符后使用`COUNTIF`函数 - **在线工具**:如 [Character Count Online](https://charactercounttool.com/) --- ### 三、结果验证 1. **交叉核对**:用不同工具重复统计对比结果 2. **注意编码问题**:确保文本文件使用UTF-8等通用编码格式 3. **处理重复符号**:如全角/半角符号需区分统计(例如`,`与`,`) --- ### 四、进阶优化 1. **自定义符号过滤**:通过正则表达式精确匹配特定符号类型 ```python import re symbols = re.findall(r'[^\w\s]', text) # 匹配非字母数字和空格的字符 ``` 2. **可视化输出**:用`matplotlib`生成柱状图展示统计结果 --- ### 五、注意事项 - 中英文标点需分别处理(Unicode编码不同) - 避免统计空格和换行符(除非特别需要) - 对长文本建议分块读取,避免内存溢出 通过上述方法,可高效准确地完成符号统计任务。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值