Python正则表达式内部循环

Python正则表达式内部循环,python,Python,我正在尝试用正则表达式解析文档列表(无法使用用户BeautifulSoup)。我现在可以循环遍历文件夹中的每个txt文档,但我现在必须解析它们。我使用Python才几天,现在有点困惑 我想生成一个字典,ID为,值为 文件的示例: <DOC> <DOCNO> 443 </DOCNO> <TEXT>Hello Word</TEXT> </DOC> <DOC> <DOCNO> 3745 </DOCNO

我正在尝试用正则表达式解析文档列表(无法使用用户BeautifulSoup)。我现在可以循环遍历文件夹中的每个txt文档,但我现在必须解析它们。我使用Python才几天,现在有点困惑

我想生成一个字典,ID为
,值为

文件的示例:

<DOC>
<DOCNO> 443 </DOCNO>
<TEXT>Hello Word</TEXT>
</DOC>
<DOC>
<DOCNO> 3745 </DOCNO>
<TEXT> Hola amigo </TEXT>
</DOC>

443
你好词
3745
你好,朋友
到目前为止,我的代码是:

    path = "data"

    for filename in os.listdir(path):
        print(filename)
        file = open(path + "/" + filename)
        page = file.read()
        page = page.replace('  ', ' ')

        //stuck here 
        doc_regex = re.compile("<DOC>.*?</DOC>", re.DOTALL)
        docno_regex = re.compile("<DOCNO>.*?</DOCNO>")
        text_regex = re.compile("<TEXT>.*?</TEXT>", re.DOTALL)
path=“数据”
对于os.listdir(路径)中的文件名:
打印(文件名)
文件=打开(路径+“/”+文件名)
page=file.read()
第页=第页。替换(“”,“”)
//困在这里
doc_regex=re.compile(“*”,re.DOTALL)
docno_regex=re.compile(“.*?”)
text_regex=re.compile(“*”,re.DOTALL)

最佳实践是在模块级编译一次正则表达式(而不是在
for
循环中)。 例如,您可以编写:

重新导入
doc_regex=re.compile((*),re.DOTALL)
docno_regex=re.compile((*?)
text_regex=re.compile((*?),re.DOTALL)
第一次加载模式时,将编译正则表达式

注意:在正则表达式中,需要使用组“(…)”来检索每个标记的内容

有几个陷阱:

  • 您应该使用
    os.path.join
    来计算文件的完整路径(在Windows上,路径分隔符是
    \
    ,而不是
    /
    os.path.join
    就是为您这样做的

  • 应该使用
    with
    语句打开文件并指定文件编码。在文本模式下,如果未指定编码,则使用的编码取决于平台

因此,您的循环可以转换为:

path=“数据”
对于os.listdir(路径)中的文件名:
fullpath=os.path.join(路径,文件名)
打印(文件名)
打开(完整路径,模式=“r”,编码=“utf-8”)作为fd:
page=fd.read()
要解析数据,可以使用
re.findall
。还有其他的方法,还有

您可以使用doc_regex查找每个
,然后使用docno_regex和text_regex查找docno和文本

在循环中,可以这样做:

用于doc_regex.findall(第页)中的doc_内容:
docno=docno_regex.findall(doc_内容)[0].strip()
text=text\u regex.findall(文档内容)[0].strip()
打印(文件编号、文本)
要在字典中存储每个条目,可以定义一个
dict
,如下所示:

result={}
对于doc_regex.findall(第页)中的doc_内容:
docno=docno_regex.findall(doc_内容)[0].strip()
text=text\u regex.findall(文档内容)[0].strip()
结果[docno]=文本
你会得到:

{'3745':'Hola amigo','443':'Hello Word'}

为什么不能使用BeautifulSoup?这个怎么样

from simplified_scrapy.simplified_doc import SimplifiedDoc
html ='''
<DOC>
<DOCNO> 443 </DOCNO>
<TEXT>Hello Word</TEXT>
</DOC>
<DOC>
<DOCNO> 3745 </DOCNO>
<TEXT> Hola amigo </TEXT>
</DOC>
'''
xml = SimplifiedDoc(html)
docs = xml.selects('DOC')
dic = {}
for doc in docs:
  dic[doc.DOCNO.text]=doc.TEXT.text
print (dic)
不能使用用户美化组,嗯,为什么?你能使用其他图书馆吗?
{'443': 'Hello Word', '3745': 'Hola amigo'}