簡體   English   中英

如何使用正則表達式從文本文件中提取帶標簽的文本?

[英]How to extract tagged text from a text file using a 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(我嘗試了許多不同的方法)。

您需要使用positive lookbehindpositive lookahead 正則表達式中的<seg><\\seg>會消耗一些文本,因此您會在結果中看到它們,但是lookahead和lookbehind只是分別檢查</seg><seg>是否存在,而不消耗任何字符。 它只匹配那些字符串。

Tl; dr: lookahead和lookbehind匹配<seg>string</seg>中的字符串 ,而不是標簽。

因此,您的正則表達式應類似於(?<=<seg>).*(?=</seg>) ,這應該很好。

有一些documantation 這里

這是將在每行中打印不帶標簽的所有帶標簽文本的內容:

重要的修改是將您的正則表達式從(r"<seg>(.*)</seg>"更改為r"<seg>(.*?)</seg>"注意在*之后添加了? 。稱為將其設為“非貪婪”,因此它與其余文本盡可能匹配(默認為“貪婪”模式),這在Python的在線文檔的“ 正則表達式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)

您可以為此使用BeautifulSoup。

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

正則表達式也可以是:

import re
print re.findall("<seg>(.*?)</seg>", your input)

http://tpcg.io/B6h2So

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM