[英]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 lookbehind
和positive 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.