Python正则表达式提取字符串的一部分
Posted
技术标签:
【中文标题】Python正则表达式提取字符串的一部分【英文标题】:Python regex to extract a portion of string 【发布时间】:2015-12-31 22:53:09 【问题描述】:我想提取一个大字符串的一部分。在此之前和之后的词数有一个目标词和一个上限。因此,提取的子字符串必须包含目标词以及它之前和之后的上限词。如果目标词更接近文本的开头或结尾,则前后部分可以包含较少的词。
示例字符串
“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谴责 voluptate velit esse cillum dolore eu fugiat nulla pariatur。Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum。"
目标词: laboris
words_before: 5
words_after: 2
应该返回['veniam, quis nostrud exercitation ullamco laboris nisi ut']
我想到了几种可能的模式,但都没有奏效。我想也可以通过简单地从目标词前后遍历字符串来完成。然而,正则表达式肯定会让事情变得更容易。任何帮助将不胜感激。
【问题讨论】:
感谢您的所有回答。所有这些都按需要工作。正则表达式对我来说最方便,因为我的字符串中充满了非字母字符! 【参考方案1】:您也可以使用nltk
来接近它,它是"concordance" method,灵感来自Calling NLTK's concordance - how to get text before/after a word that was used?:
索引视图向我们展示了给定单词的每次出现 有一些上下文。
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']
【讨论】:
【参考方案2】: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
【讨论】:
这似乎总是给 5 之前和 2 之后。我认为OP想要之前和之后的任意数字。还是实际上只有 5 个或 2 个? @idjaw 我改了一下,现在是一个函数,可以输入参数值。【参考方案3】:如果要拆分单词,可以使用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']
【讨论】:
以上是关于Python正则表达式提取字符串的一部分的主要内容,如果未能解决你的问题,请参考以下文章