2017-06-14 95 views
0

我有一个手动的输入文件由引文组成,每个格式为:如何使用正则表达式从文本中提取由标签分隔的多个引用?

<小号SID =“2” SSID =“2”>它不同于先前的机器 基于学习的,因为它净入学使用来自整个 文档的信息来对每个词进行分类,只用一个分类器。以前涉及从整个文档中收集信息的工作通常使用第二分类器 ,其纠正了基于主要句子的分类器的错误。 < /S>

下面是使用Python的re模块我目前的做法:

citance = citance[citance.find(">")+1:citance.rfind("<")] 
fd.write(citance+"\n") 

我试图提取了从第一关角括号(“>”)到最后的发生打开角度支架(“<”)。然而,在多个citances的情况下,作为中间变量也输出得到提取这种方法失败:

它不同于以往基于机器学习的净入学率,它使用 信息,从整个文件到每个分类字,只有 一个分类器。 </S> < S sid =“3”ssid =“3”>以前的工作涉及到 从整个文档收集信息通常使用一个 二级分类器,它可以纠正基于句子的分类器的错误。

我想要的输出:

它不同于以前的机器学习为主的净入学率,它使用 信息,从整个文档的每个词进行分类,只有 一个分类。涉及 所述的从整个文件的信息收集先前的工作经常使用 二级分类器,其校正的主 sentence-基于分类器的错误。

我怎样才能正确地实现这一点?

回答

1

我会去与蟒蛇正则表达式模块:通过做re

re.findall(r'\">(.*?)<', text_to_parse) 

这个方法会从一个到多个报价回来,但你可以加入后他们,如果你想有一个统一的文本(" ".join(....)

1

而是重新使用的模块,看看到bs4库。

这是一个XML/HTML解析,从而你可以得到标记之间的一切。

对你来说,这将是这样的:

from bs4 import BeautifulSoup 

xml_text = '< S sid ="2" ssid = "2">It differs from previous machine learning-based NERs in that it uses information from the whole document to classify each word, with just one classifier.< /S>< S sid ="3" ssid = "3">Previous work that involves the gathering of information from the whole document often uses a secondary classifier, which corrects the mistakes of a primary sentence- based classifier.< /S>' 

text_soup = BeautifulSoup(xml_text, 'lxml') 

output = text_soup.find_all('S', attrs = {'sid': '2'}) 

输出将包含文本:

它不同于以前的机器学习为主的净入学率,它使用从整个文档资料用一个分类器对每个词进行分类。

而且,如果你只是想删除HTML标签:

import re 

xml_text = '< S sid ="2" ssid = "2">It differs from previous machine learning-based NERs in that it uses information from the whole document to classify each word, with just one classifier.< /S>< S sid ="3" ssid = "3">Previous work that involves the gathering of information from the whole document often uses a secondary classifier, which corrects the mistakes of a primary sentence- based classifier.< /S>' 

re.sub('<.*?>', '', html_text) 

将做的工作。

0

我认为这就是你要找的。

import re 

string = ">here is some text<>here is some more text<" 
matches = re.findall(">(.*?)<", string) 
for match in matches: print match 

看起来好像你有一个问题得到太多的结果。 “这里是更多文字<”的匹配可以来自字符串中的第一个字符到最后一个字符,因为它们是“>”和“<”,而忽略中间的字符。 '。*?'成语会使它找到最大的点击次数。

相关问题