python中从fi读取文本的正则表达式

2024-09-27 21:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正则表达式,可以扫描html文件中的一些数据 代码正在使用BeautifulSoup删除html标记,并返回以下文本(只是文本的一部分):

/学期: 2011/1 编号: 20112222年

姓名: XXXX XXXX XXXX XXXX 顾问

我的代码示例:

import re,glob,os
from bs4 import BeautifulSoup
import nltk

path = 'C:\\xampp\\htdocs\\data_tools\\transcripts'
os.chdir(path)
delch=','

def scantext(text,snum) :
    re_semstudent = re.compile("Semester:\s*(\d*)\s*\/\s*(\d)\s*Number\s*:\s*(\d{8})\s*Name\s*:\s*(.*)\s*Advisor")
    semesters = text.split("Year")

    for ind in range(1,len(semesters)):
        s = semesters[ind]
        x = re.search(re_semstudent,s)
        if x :
            year=x.group(1)
            semester=x.group(2)
            studentid=x.group(3)
            studentname=x.group(4)

        print year+"#"+semester

    return 0

ii=1
for fname in glob.glob("*.html") :
    f = open (fname)        
    text = BeautifulSoup(f.read(), 'html.parser').getText()
    scantext(text,ii)

当我尝试检索文本作为固定字符串,工作正常! 但是当我在scantext函数中发送文本并使用semesters = text.split("Year")时。我可以打印每个分割的文本,但是正则表达式不能匹配任何值!你知道吗


Tags: path代码text文本importreoshtml
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:32

您需要^{}标志:

  re_semstudent = re.compile("Semester:\s*(\d*)\s*\/\s*(\d)\s*Number\s*:\s*(\d{8})\s*Name\s*:\s*(.*)\s*Advisor",re.U)

如果你追着它跑,它会给你一些东西,比如:

<_sre.SRE_Match object at 0x7fe9fb721df8>
2011#1
<_sre.SRE_Match object at 0x7fe9fb721d50>
2011#2
<_sre.SRE_Match object at 0x7fe9fb721df8>
2012#1
<_sre.SRE_Match object at 0x7fe9fb721d50>
2012#2

您可能还需要使用encoding="utf-8"打开文件:

from io import open
for fname in glob.glob("*.html") :
    with open(fname, encoding="utf-8") as f:
        text = BeautifulSoup(f.read(), 'html.parser').getText()
        scantext(text, ii)

相关问题 更多 >

    热门问题