0

我有一个接收字符串和前缀词的函数。我想使用 re.findall 来获取跟随给定前缀的后缀词列表。例如:

string: "My mother gave my sister my robot." 
prefix: "my"
result: ["mother", "sister", "robot"]

我的实现是

def suffix(txt, prefix):
    rv = re.findall(prefix + r' \w{4-15}',txt)
    rv = [i.replace(prefix,'') for i in rv]
    return rv

但是,我得到 [] 返回。有人可以建议我如何使用 re 来实现这一点吗?

4

4 回答 4

2

建立在其他答案之上的是 1 班轮

>>> s = "My mother gave my sister my robot."
>>> import re
>>> prefix = "my"
>>> re.findall(prefix + r'\s+(\w+)', s, re.IGNORECASE)
['mother', 'sister', 'robot']
>>> 
于 2018-01-19T16:37:33.213 回答
1

这里有几个问题,首先量词内的范围分隔符是逗号而不是连字符,所以:{4,15}而不是{4-15}.

其次,您需要同时匹配myand My,因此匹配应该不区分大小写 ( re.IGNORECASE)。

第三,如果您使用捕获括号组(圆括号),finditer那么您不需要修改前缀。

尝试这个:

import re

def suffix(txt, prefix):
    rv = []
    for m in re.finditer(prefix + r' (\w{4,15})', txt, re.IGNORECASE):
        rv.append(m.groups()[0])

    return rv

print suffix("My mother gave my sister my robot.", "my")

给出:

['mother', 'sister', 'robot']

根据需要,\b(单词边界)可能比分隔单词的空格更好。例如:“my, and your, stuff” 将不匹配使用空格。

于 2018-01-19T16:25:53.433 回答
0

由于@cdarke 涵盖了您的问题的主要问题,另一种方法是拆分string为带有 的单词列表re.sub(),如果列表中的单词等于 的任何大小写prefix,则获取前一个单词并将其添加到结果列表中。

这是一个例子:

import re

string = "My mother gave my sister my robot."
prefix = "my"

words = re.sub("[^\w]", " ",  string).split()

suffixes = [words[i] for i in range(len(words)) if words[i-1].lower() == prefix]

print(suffixes)

哪些输出:

['mother', 'sister', 'robot']

注意:为了检查单词列表中的任何大小写是否与 匹配prefix,您可以先将其转换为小写lower()

于 2018-01-19T16:35:45.277 回答
0

这就是你需要积极的 Lookbehind 的地方:

开始了:

import re

def find_suffix(word,string):
    pattern = '(?<=' + word + '\s)\w+'
    return re.findall(pattern,string)
print(find_suffix('my',"my mother gave my sister my robot."))

输出:

['mother', 'sister', 'robot']
于 2018-01-20T16:08:57.923 回答