天天看點

使用正規表達式從文本中定位并提取想要的内容

文章目錄

      • 一、問題提出
      • 二、解決思路
      • 三、代碼
      • 四、結果

一、問題提出

還是年報問詢函的研究,需要從問詢函文本中提取交易所要求回複的日期,同時還需要從公司回複的文本中提取公司實際上回複的日期。是以需要對兩類文本分别進行分析。

二、解決思路

通過觀察,發現問詢函中含有交易所要求回複的日期的句子通常是這樣的:

“請你公司就上述問題做出書面說明,并在 8 月 9 日前将有關說明 材料報送我部,并對外披露。”

“請你公司就上述問題做出書面說明,涉及需披露的,請及時履行披露義務,并在2015年5月6日前将有關說明材料報送我部,同時抄送派出機構。”

相應的提取規則就很簡單啦:

要求回複日期提取規則 = re.compile('[在于](.*月.*日)前', re.M)
    查詢結果 = re.findall(b, 問詢函文本)
    要求回複日期 = 查詢結果[0].strip()
           

而公司的回函通常在整個回函的最後一行署上回函日期:

eg1:萬科的回函

使用正規表達式從文本中定位并提取想要的内容

eg2:全新好的回函

使用正規表達式從文本中定位并提取想要的内容

是以回函日期的提取規則為:

回函日期提取規則 = re.compile('(^.*年.*月.*日)', re.M)
    查詢結果 = re.findall(b, 回函文本)
    回函日期 = 查詢結果[-1].strip()
           

三、代碼

以提取回函時間為例,完整的周遊一個檔案夾下所有TXT和DOC檔案,提取其中文字并使用正規表達式提取回函時間的代碼為:

import os
import docx2txt
import re
content_list = []

def readdocx(filepath):
    content = docx2txt.process(filepath)  #打開傳進來的路徑
    docucode = filepath.split('/')[-1]
    content_list.append([docucode.split('.')[0],content])

def readtxt(filepath):
    content = open(filepath, "r").read()     #打開傳進來的路徑
    docucode = filepath.split('/')[-1]
    content_list.append([docucode.split('.')[0],content])

def eachFile(filepath):
    pathDir = os.listdir(filepath)      #擷取目前路徑下的檔案名,傳回List
    for s in pathDir:
        newDir=os.path.join(filepath,s)     #将檔案命加入到目前檔案路徑後面
        if os.path.isfile(newDir) :         #如果是檔案
            doctype = os.path.splitext(newDir)[1]
            if doctype == ".txt":  #判斷是否是txt
                readtxt(newDir)
            elif doctype == ".docx":
                readdocx(newDir)
            else:
                pass
        else:
            eachFile(newDir)                #如果不是檔案,遞歸這個檔案夾的路徑


eachFile("/Users/深交所回複/")

f = open("/Users/深交所回函時間.txt",'w')
a = 1
for doc in content_list:
    回函日期提取規則 = re.compile('(^.*年.*月.*日)', re.M)
    查詢結果 = re.findall(b, 回函文本)
    if a:
        print([doc[0],查詢結果[-1].strip()])
        f.write(','.join([doc[0],查詢結果[-1].strip()])+'\n')
           

四、結果

回函編碼 回函時間
CDD00060941539694HF 2017年5月9日
CDD000711538301452HF 二〇一九年四月三日
CDD000160518921313HF 2018 年 10 月 24 日
CDD00066240310540HF 2016 年 11 月 30 日
CDD00001841921743HF 二〇一七年六月八日
CDD000767516771355HF 二〇一八年十二月五日
CDD00085036747HF 2015 年 12 月 1 日
CDD00070642758829HF 2017 年 8 月 30 日
CDD000995523321387HF 2018 年 12 月 24 日
CDD00061039434429HF 年 月 日
CDD00053343479922HF 2017 年 12 月 25 日
CDD00015540186516HF 二〇一六年十一月九日
CDD00091237491HF 2016 年 3 月 14 日
CDD000803515551281HF 二〇一八年九月二十七日
CDD00051840669600HF 2017 年 1 月 16 日
CDD00095843607935HF 2018 年 1 月 9 日
CDD000917516581436HF 2019 年 2 月 26 日
CDD00098239987494HF 二〇一六年十月十四日
CDD000566511201229HF 二〇一八年七月三十一日
XXB_CDD_000829天音控股回複 2015 年 6 月 25 日