regex - 在句子中查找单词序列(字符串)的位置
问题描述
我有一个带有两个标记<e1>
和的句子</e1>
。我需要这两个标记之间的单词序列位置的索引。请注意, , 和其他可能的字符被计算在内!
sent="Hi please help me to <e1>solve, this problem please</e1> Thank you."
我需要什么(所需的输出):
[5、6、7、8、9]
如果您从句子的开头计算每个单词,我需要两个标记之间的序列索引:
solve -> 5
, -> 6
this -> 7
problem -> 8
please -> 9
我尝试了这两种解决方案:
解决方案1:
sent="Hi please help me to <e1>solve, this problem please</e1> Thank you." E1 = re.search('<e1>(.*)</e1>', sent).group(1) sent = sent.replace('<e1>', '') sent = sent.replace('</e1>', '') sent = word_tokenize(sent) E1_indx = [] E1_lis = word_tokenize(E1) print(E1_lis) for item in E1_lis: E1_indx.append(sent.index(item)) print(E1_indx)
但输出是:
[5、6、7、8、1]
解决方案2:
sent="Hi please help me to <e1>solve, this problem please</e1> Thank you."
e1_st = re.findall(r'<e1>\w+', sent)
e1_end = re.findall(r'\w+</e1>', sent)
e1_st=(''.join(str(x) for x in e1_st))
e1_end=(''.join(str(x) for x in e1_end))
e1_st = e1_st.replace('<e1>', '')
e1_end = e1_end.replace('</e1>', '')
sent = sent.replace('<e1>', '')
sent = sent.replace('</e1>', '')
sent = word_tokenize(sent)
print(list(range(sent.index(e1_st), sent.index(e1_end)+1)))
输出:
[]
当在它之前有一个重复的序列词(这里是“请”)时,就会出现问题。
有没有直接的解决方案?
解决方案
看起来像这个问题。
如果您按以下方式计算偏移量并删除标记,您应该会得到预期的结果。
sub_b = sent.find('<e1>')
sent = sent.replace('<e1>')
sub_e = sent.find('</e1>')
sent = sent.replace('</e1>')