如何使用正则表达式从文本文件中提取带标签的文本?

时间:2018-12-26 10:43:20

标签: python regex

对于一个类,我需要提取元素<seg> ... </seg>之间的所有内容,而我正在尝试通过Python来完成此操作,而不是浪费大量的时间手动进行操作(超过400行)。我现在在代码方面所拥有的是这样的(我在网上找到了一个代码,并对其进行了一些更改,以使其不会打印行号):

import re                           
err_occur = [] 
pattern = re.compile(r"<seg>(.*)</seg>")
try:
    with open ('corpus.txt', 'rt') as in_file:
        for linenum, line in enumerate(in_file):
            if pattern.search(line) != None:
                err_occur.append((linenum, line.rstrip('\n')))
        for linenum, line in err_occur:
            print(line, sep='')
except FileNotFoundError:
    print("Input file not found.")

我唯一遇到的问题是它在结果中打印<seg></seg>,我不想发生这种情况。我尝试创建组(您可以在pattern变量中使用括号的方式看到),但是我不知道如何操作代码以仅返回组1(我尝试了许多不同的方法)。

3 个答案:

答案 0 :(得分:0)

您需要使用positive lookbehindpositive lookahead。正则表达式中的<seg><\seg>会消耗一些文本,因此您可以在结果中看到它们,但是先行和后退只是检查</seg><seg>是否分别存在任何字符。它只匹配那些字符串。

Tl; dr:向前和向后匹配字符串 <seg>string</seg>,而不是标签。

因此您的正则表达式应类似于(?<=<seg>).*(?=</seg>),这应该没问题。

有一些文件here

答案 1 :(得分:0)

这里可以打印出每行中没有标签的所有带标签的文本:

重要的修改是将您的正则表达式从(r"<seg>(.*)</seg>"更改为r"<seg>(.*?)</seg>"-注意在?之后添加的*。这被称为使其“非贪婪”,因此它不匹配尽可能多的剩余文本(默认为“贪婪”模式)。 Python的在线文档的Regular Expression HOWTO部分对此进行了详细讨论。

正则表达式的另一个重要变化是使用pattern.findall()中的pattern.search()

我还删除了代码中处理行号的所有部分,因为您提到您对该信息不感兴趣。

import re

err_occur = []
pattern = re.compile(r"<seg>(.*?)</seg>")
input_filename = 'corpus.txt'

try:
    with open(input_filename, 'rt') as in_file:
        for line in in_file:
            matches = pattern.findall(line)
            if matches:
                for match in matches:
                    err_occur.append(match)
except FileNotFoundError:
    print("Input file %r not found." % input_filename)

for tagged in err_occur:
    print(tagged)

答案 2 :(得分:0)

您可以为此使用BeautifulSoup。

Mesh mesh = {
// Position         // Color                // Tex coords
0.5f, 0.5f, 0.0f,   1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.0f,  0.0f, 0.0f, 0.5f, 1.0f, 1.0f, 1.0f,
// Index
0,1,2,2,3,0
};

正则表达式也可以是:

soup = BeautifulSoup(your input)
print soup.findAll("seg")[0].renderContents()

http://tpcg.io/B6h2So