Python正则表达式提取字符串的一部分

8
我想提取一个大字符串的一部分内容。有一个目标词和一个单词数的上限,在目标词前后都要考虑这个上限。所以被提取的子字符串必须包含目标词以及前后的单词上限。如果目标词靠近文本的开头或结尾,则前后一部分可能包含更少的单词。 示例字符串: "Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum." 目标词: laboris 前面的单词数: 5 后面的单词数: 2
应当返回:['veniam, quis nostrud exercitation ullamco laboris nisi ut']
我思考了几种可能的模式,但它们都没有起作用。我猜可以通过从目标词的前面和后面遍历字符串来完成。但是,使用正则表达式肯定会使事情变得更加容易。谢谢您的帮助。

感谢所有的回答。它们都按照预期工作。正则表达式是最方便的,因为我所拥有的字符串中充满了非字母字符! - user2963623
3个回答

5

如果你想分割单词,可以使用slice()split()函数。例如:

>>> text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
 tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, qu
is nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
 fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 
culpa qui officia deserunt mollit anim id est laborum.".split()

>>> n = text.index('laboris')
>>> s = slice(n - 5, n + 3)

>>> text[s]
['veniam,', 'quis', 'nostrud', 'exercitation', 'ullamco', 'laboris', 'nisi', 'ut']

3
If you still want regex....

def find_context(word_, n_before, n_after, string_):
    import re

    b= '\w+\W+'  * n_before
    a=  '\W+\w+' * n_after
    pattern = '(' + b + word_ + a + ')'

    print(re.search(pattern, string_).groups(1)[0])


find_context('laboris', 5, 2, st)

veniam, quis nostrud exercitation ullamco laboris nisi ut

find_context('culpa', 2, 2, st)

sunt in culpa qui officia

1
这似乎总是在前面给出5个,在后面给出2个。我认为OP想要任意数量的前缀和后缀。或者实际上只有5或2吗? - idjaw
1
@idjaw 我做了一个更改,现在它是一个函数,可以输入参数值。 - LetzerWille

2
你也可以使用 nltk 和它的 "concordance" 方法 来处理,该方法受到了“调用NLTK的concordance - 如何获得使用的单词之前/之后的文本?” 的启发。在 concordance 视图中,我们可以看到每个给定单词的出现次数以及一些上下文。请注意保留HTML标签。
import nltk


def get_neighbors(input_text, word, before, after):
    text = nltk.Text(nltk.tokenize.word_tokenize(input_text))

    concordance_index = nltk.ConcordanceIndex(text.tokens)
    offset = next(offset for offset in concordance_index.offsets(word))

    return text.tokens[offset - before - 1: offset] + text.tokens[offset: offset + after + 1]

text = u"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."  
print(get_neighbors(text, 'laboris', 5, 2))

打印目标单词前5个单词/标记和后2个:

[u'veniam', u',', u'quis', u'nostrud', u'exercitation', u'ullamco', u'laboris', u'nisi', u'ut']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接