Python 如何保持正则表达式匹配结果的顺序

Python 如何保持正则表达式匹配结果的顺序,python,regex,python-2.7,Python,Regex,Python 2.7,为了匹配单词中的句子,我使用了我的答案中的代码 这将使我: [w for w in words if re.search(r'\b{}\b'.format(re.escape(w)), sentence)] 现在,如果单词列表是以另一个顺序给出的(单词=['hopped','Alice','played']),我希望按照它们在句子中出现的顺序显示匹配结果,即,仍然需要: ['Alice', 'jumped'] 而不是 ['Alice', 'jumped'] 我应该如何修改代码?您可以这样

为了匹配
单词
中的
句子
,我使用了我的答案中的代码

这将使我:

[w for w in words if re.search(r'\b{}\b'.format(re.escape(w)), sentence)]

现在,如果
单词
列表是以另一个顺序给出的(
单词=['hopped','Alice','played']
),我希望按照它们在
句子中出现的顺序显示匹配结果,即,仍然需要:

['Alice', 'jumped']
而不是

['Alice', 'jumped']

我应该如何修改代码?

您可以这样构建您的模式:

['jumped','Alice']
使用芬德尔

 pattern = r'\b(?:' + '|'.join(words) + r')\b'
要删除重复项,请执行以下操作:

 re.findall(pattern, sentence)

您可以这样构建您的模式:

['jumped','Alice']
使用芬德尔

 pattern = r'\b(?:' + '|'.join(words) + r')\b'
要删除重复项,请执行以下操作:

 re.findall(pattern, sentence)

一种方法是以句子为基础,过滤其他列表中的单词:

list(set(re.findall(pattern, sentence)))
或:

或者,您可以创建word->last index的查找,并使用:

word_set = set(words)
in_order = [word for word in sentence_words if word in word_set]
也许可以将两者结合起来:

lookup = {word: idx for idx, word in enumerate(sentence_words)}
words.sort(key=lookup.__getitem__)
['Alice', 'jumped']

一种方法是以句子为基础,过滤其他列表中的单词:

list(set(re.findall(pattern, sentence)))
或:

或者,您可以创建word->last index的查找,并使用:

word_set = set(words)
in_order = [word for word in sentence_words if word in word_set]
也许可以将两者结合起来:

lookup = {word: idx for idx, word in enumerate(sentence_words)}
words.sort(key=lookup.__getitem__)
['Alice', 'jumped']

若句子是“爱丽丝跳过爱丽丝”,你们想得到什么?若句子是“爱丽丝跳过爱丽丝”,你们想得到什么?非常感谢!这对我有用。我是python新手,你能告诉我模式构建中的哪个部分指示发生的顺序吗?@ChuNan:模式中没有这方面的部分,唯一的问题是正则表达式引擎从左到右处理文本。你可以按你想要的任何顺序给出一个单词列表,你将得到相同的结果(句子中的顺序),因此,正如注释中所示的句子:Alice跳过Alice,后面出现的相同单词“Alice”将替换re.findall中较早出现的单词。然后是['jump','Alice']。对吗?@ChuNan你得到的结果是
['Alice','jump','Alice']
。@ChuNan:Jerry是对的,你想避免重复吗?非常感谢!这对我有用。我是python新手,你能告诉我模式构建中的哪个部分指示发生的顺序吗?@ChuNan:模式中没有这方面的部分,唯一的问题是正则表达式引擎从左到右处理文本。你可以按你想要的任何顺序给出一个单词列表,你将得到相同的结果(句子中的顺序),因此,正如注释中所示的句子:Alice跳过Alice,后面出现的相同单词“Alice”将替换re.findall中较早出现的单词。然后是['jump','Alice']。对吗?@ChuNan您得到的结果是
['Alice','jump','Alice']
。@ChuNan:Jerry是对的,您想避免重复吗?谢谢您的方法!谢谢你的方法!