【问题标题】:Extract words preceding and following search terms提取搜索词前后的词
【发布时间】:2018-07-18 16:03:42
【问题描述】:

假设我有如下文本。

纽约市通常称为纽约市或简称纽约 美国人口最多的城市。估计 人口 8537673 分布在约 3026 的土地上 平方英里(784 平方公里) 纽约市也是最密集的 美国人口稠密的主要城市。

我想定位搜索词出现前后的 n 个单词。例如,n=3 并搜索 term="New York",则

第一次出现:

  • 前面的词 = {The, city, of}
  • 后面的词 = {经常,叫,新}

第二次出现:

  • 前面的词 = {York,经常,叫}
  • 后面的单词 = {City,或者,简单地说}

第三次出现:

  • 前面的词 = {城市,或者,简单地说}
  • 后面的单词 = {is, the, most}

第 4 次出现:

  • 前面的单词 = {miles, 784, km2}
  • 后面的单词 = {City, is, also}

如何使用正则表达式来做到这一点?我在这里Extract words surrounding a search word 发现了一个类似的问题,但它没有考虑多次出现的搜索词。

尝试:

def search(text,n): 
word = r"\W*([\w]+)" 
groups = re.search(r'{}\W*{}{}'.format(wordn,'place',wordn), text).groups() return groups[:n],groups[n:]

【问题讨论】:

  • 我在今天之前看到过这个问题。这是家庭作业。你试过正则表达式了吗?
  • 我已经尝试了我提到的链接中给出的正则表达式,但它没有考虑多次出现的搜索词

标签: regex


【解决方案1】:

您需要使用positive lookahead assertion 来处理重叠匹配:

re.findall(r"((?:\w+\W+){3})(?=New York((?:\W+\w+){3}))", t)

结果:

[('The City of ', ' often called New'),
 ('York often called ', ' City or simply'),
 ('City or simply ', ' is the most'),
 ('miles (784 km2) ', ' City is also')]

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    ((?:\w+\W+){3})(?=New York((?:\W+\w+){3}))
    

    并在第 1 组和第 2 组中获取您的值

    示例源 (run here)

    import re
    regex = r"((?:\w+\W+){3})(?=New York((?:\W+\w+){3}))"
    
    test_str = "The City of New York often called New York City or simply New York is the most populous city in the United States. With an estimated 2016 population of 8537673 distributed over a land area of about 3026 square miles (784 km2) New York City is also the most densely populated major city in the United States."
    matches = re.finditer(regex, test_str)
    
    for match in matches:
        print(re.sub(r'\W+', ' ', match.group(1))+"  <------>" +re.sub(r'\W+', ' ', match.group(2)))
    

    Regex 101 Demo

    【讨论】:

    • 这仅适用于 n=3。你怎么能把它通用?取决于用户给出的字数?你也错过了第二次。
    • 嗯,它可以按照您提到的方式完成,但这意味着您可以将整个句子作为 3 个单词来完成……这样可以吗?顺便说一句,你还没有提到你想使用的语言
    • 是的,我正在使用 Python
    • 更新答案请看
    • 嗯,这不会提供正确的结果(由于匹配重叠,第二次出现丢失)。我想知道为什么它被接受了......
    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2010-10-25
    • 2012-07-17
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多