正则表达式使用

正则表达式符号含义

python 复制代码
\s 匹配任何空白字符,包括空格、制表符(\t)、换行符(\n)、回车符(\r)、垂直制表符(\v)和换页符(\f)。
\S 是 \s 的否定形式,匹配任何非空白字符。
\d 匹配任何数字字符,等价于 [0-9]。
.  表示任意字符
*  表示0个或多个字符
+  表示1个或多个字符

文本提取 示例代码

python 复制代码
import re
import sys

from utils.ocr_images_pdf import cno_ocr


# 发文日期
def extract_date(text):
    date_pattern = r'\d{4}年\d{1,2}月\d{1,2}日'
    match = re.search(date_pattern, text)   #re.search 或 re.match 方法时,match 对象包含了匹配的结果。如果你没有使用任何捕获组(即圆括号 ()),那么 match.group(0) 就是整个匹配的字符串。
    return match.group(0) if match else None


# 部门级别
def extract_department_level(text):
    level_pattern = r'市民政局.*?为(.+?)。'
    match = re.search(level_pattern, text)
    return match.group(1) if match else None


# 部门职责
def extract_duties(text):
    # 提取主要职责部分
    ''''''
    '''
    \s 匹配任何空白字符,包括空格、制表符(\t)、换行符(\n)、回车符(\r)、垂直制表符(\v)和换页符(\f)。
    \S 是 \s 的否定形式,匹配任何非空白字符。
    \d 匹配任何数字字符,等价于 [0-9]。
    .  表示任意字符
    *  表示0个或多个字符
    +  表示1个或多个字符
    '''
    duties_pattern = r'主要职责是:([\s\S]*?)第四条'
    match = re.search(duties_pattern, text)
    if match:
        duties_text = match.group(1).strip()

        # 统一文本中的括号类型
        # 将所有中英文括号替换为中文括号
        duties_text = duties_text.replace('(', '(').replace(')', ')')

        # print("Duties Text:\n", duties_text)  # 调试用,查看提取的职责文本

        # 定义可能的职责项标记
        delimiters = [
            '(一)', '(二)', '(三)', '(四)', '(五)',
            '(六)', '(七)', '(八)', '(九)', '(十)',
            '(十一)', '(十二)', '(十三)', '(十四)',
            '(十五)', '(十六)'
        ]

        duties_list = []
        start_idx = 0

        for delimiter in delimiters:
            # 查找下一个职责项的起始位置
            next_idx = duties_text.find(delimiter, start_idx)
            if next_idx == -1:
                break
            # 提取当前职责项的内容
            duty_content = duties_text[start_idx:next_idx].strip()
            if duty_content:
                duties_list.append(duty_content)
            # 更新开始位置
            start_idx = next_idx

        # 处理最后一个职责项
        last_duty_content = duties_text[start_idx:].strip()
        if last_duty_content:
            duties_list.append(last_duty_content)

        # 去除可能的多余空白字符
        formatted_duties = [duty.strip() for duty in duties_list if duty.strip()]

        # print("Duties List:\n", formatted_duties)
        return formatted_duties

    return []


# 内设机构职责
def extract_institutions(text):
    # 提取内设机构部分
    institutions_pattern = r'第四条市民政局设下列内设机构:([\s\S]*?)第五条'
    match = re.search(institutions_pattern, text)
    if match:
        institutions_text = match.group(1).strip()

        # 统一文本中的括号类型
        # 将所有中英文括号替换为中文括号
        institutions_text = institutions_text.replace('(', '(').replace(')', ')')

        # 定义可能的机构项标记
        delimiters = [
            '(一)', '(二)', '(三)', '(四)', '(五)',
            '(六)', '(七)', '(八)', '(九)', '(十)',
            '(十一)', '(十二)', '(十三)', '(十四)',
            '(十五)', '(十六)'
        ]

        institutions_dict = {}

        start_idx = 0
        for delimiter in delimiters:
            # 查找下一个机构项的起始位置
            next_idx = institutions_text.find(delimiter, start_idx)
            if next_idx == -1:
                break
            # 提取当前机构项的内容
            institution_content = institutions_text[start_idx:next_idx].strip()     # 在Python中,.strip() 是一个字符串方法,用于删除字符串两端的空白字符(包括空格、制表符、换行符等)。如果需要,也可以指定要删除的字符。
            if institution_content:
                # 分割机构名称和职责描述
                parts = institution_content.split('。', 1)
                if len(parts) == 2:
                    name, desc = parts
                    institutions_dict[name.strip()] = desc.strip()
                else:
                    name = parts[0].strip()
                    institutions_dict[name] = ''
            # 更新开始位置
            start_idx = next_idx + len(delimiter)

        # 处理最后一个机构项
        last_institution_content = institutions_text[start_idx:].strip()
        if last_institution_content:
            # 分割机构名称和职责描述
            parts = last_institution_content.split('。', 1)
            if len(parts) == 2:
                name, desc = parts
                institutions_dict[name.strip()] = desc.strip()
            else:
                name = parts[0].strip()
                institutions_dict[name] = ''

        # 去除可能的多余空白字符
        formatted_institutions = {k: v.strip() for k, v in institutions_dict.items() if k.strip()}

        return formatted_institutions

    return {}



class db_sql:
    """
    SQL语句
    'INSERT INTO "compare_department_duty_summary"(department_name,department_duty,act_id,\
    instance_id,summary_text,score,type, create_time, id) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    """
    department_duty_insert_sql = 'INSERT INTO "department_duty"(department_name,department_duty) VALUES (%s,%s)'


def extract_department_duty():
    # 1 从PDF中提取文字内容
    filePath = ''
    save_dir = '../data/tmp_check_data/tem_test/'
    text = cno_ocr(filePath, save_dir)

    # 2 从文本内容中提取部门及其职责
    # text = ('')
    # 调用函数
    # 提取日期
    date = extract_date(text)

    # 提取部门级别
    department_level = extract_department_level(text)

    # 提前部门职责
    duties = extract_duties(text)

    # 提取内设机构职责
    institutions = extract_institutions(text)

    # 提取编制信息
    compilation = extract_compilation(text)



if "__main__" == __name__:
    extract_department_duty()
相关推荐
yma162 分钟前
windows10下使用沙盒多开uiautoanimation可行性验证
python·uiautoanimation
ᥬ 小月亮3 分钟前
Js前端模块化规范及其产品
开发语言·前端·javascript
Thomas_YXQ4 分钟前
Unity3D Huatuo:划时代的原生C#热更新技术详解
开发语言·游戏·unity·c#·unity3d
HappyAcmen9 分钟前
青训营-豆包MarsCode技术训练营试题解析四十八
开发语言·python·算法
新知图书11 分钟前
微软Win11内核迎新变,Rust语言助力提升系统安全可靠性
开发语言·microsoft·rust
Zer0_on11 分钟前
数据结构二叉树
开发语言·数据结构
Pingszi18 分钟前
3.阿里云flink&selectdb-py作业
python·阿里云·flink·数仓
SomeB1oody20 分钟前
【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程
开发语言·后端·rust
新手小袁_J22 分钟前
No Python at ‘C:\Users\MI\AppData\Local\Programs\Python\Python39\python.exe‘
开发语言·python·error·no python
stormjun22 分钟前
基于 Python Django 的二手电子设备交易平台(附源码,文档)
开发语言·python·django·二手电子设备·电子设备售卖·电子设备交易