对于一个类,我需要提取元素<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(我尝试了许多不同的方法)。
答案 0 :(得分:0)
您需要使用positive lookbehind
和positive 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()