Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从重新编译匹配但不编译匹配组中获取对象_Python - Fatal编程技术网

Python 如何从重新编译匹配但不编译匹配组中获取对象

Python 如何从重新编译匹配但不编译匹配组中获取对象,python,Python,可能是一个令人困惑的标题,让我解释一下 import re fruit_list = ['apples', 'banana', 'peach', 'plum', 'pineapple', 'kiwi'] myfavourite = 'Apples are really nice' fruit_compile = re.compile('|'.join(fruit_list),flags=re.IGNORECASE) if fruit_compile.search(myfavourite):

可能是一个令人困惑的标题,让我解释一下

import re
fruit_list = ['apples', 'banana', 'peach', 'plum', 'pineapple', 'kiwi']
myfavourite = 'Apples are really nice'
fruit_compile = re.compile('|'.join(fruit_list),flags=re.IGNORECASE)

if fruit_compile.search(myfavourite):
    match = fruit_compile.search(myfavourite)
    print(match.group())
现在使用上面的代码,我可以使用
match.group()
(即
Apples
)获得匹配的字符串


如何从
fruit\u compile
(最初是
fruit\u list
)(将是
apple
)以字符串形式获取匹配的对象,而不必重复
fruit\u list

fruit\u compile.search(MyFavorite)
的结果保存到一个变量中

finding = fruit_compile.search(myfavourite)
if finding:
   doSomethingWithFruit(finding.group(0))
我注意到您已经在保存
fruit\u compile.search
的结果,但是只有在检查第一个调用是否返回
None
之后


您在一条评论中澄清,您正在寻找与字符串匹配的替代模式

一种方法是使用
matchObject.groups()
找到正确备选方案的索引。它是一个元组,其中每个不匹配的组都是
None

找到非None值的索引,您将能够从原始水果列表中检索到正确的项目。这显然涉及到以这样或那样的方式进行迭代,这与您的最后一句话背道而驰

您必须使用此方法为每个备选方案创建一个组

'(' + ')|('.join(fruits) + ')'

另一个选项是使用
for
循环,尝试逐个匹配候选项

patterns = [re.compile(p) for p in fruits]
for p in patterns:
  if p.match(string):
    return p.pattern
我不确定这对整体性能有何影响


注意:如果您的“模式”只是常量字符串,那么首先就不应该使用正则表达式。我的回答基于这样一个假设,即为了清晰起见,您的示例代码已被简化。

在Python文档页面中有一个方法可以实现这一点:

m.string[m.start(g):m.end(g)]
其中m是match对象(在您的情况下是match),g是可选的组参数。

您需要使用
.pattern

searched_pattern = fruit_compile.pattern
print (searched_pattern)

'apples|banana|peach|plum|pineapple|kiwi'

你有什么问题。您只在
水果列表
上迭代了一次,而没有再迭代。匹配的模式部分将是
'apple'
,而不是
'apple'
。您是否介意解释一下您想对匹配模式做些什么?这可能是一个错误。是的,它不是。因为你没有对手。如果匹配,可以尝试/except或其他方式,但这不是问题所在。OP通过调用
search
两次来处理
None
,这就是我建议保存结果的原因。这个问题本来可以用更好的措辞,但我认为问题不在于提取匹配的字符串。这正是m.group所做的……什么。我在这里看到的代码片段中的“match”是一个变量名,用于存储re.search()调用的结果。对不起,我的意思是
search
。编辑。哦,是的,那个。是的,做两次同样的工作是毫无意义和低效的。这不是我想要的。我不需要整个模式,但需要编译对象中的匹配。这只需要获得match.group(来自myfavorite),我已经有了它。我需要知道编译的re对象中与myfavorite内容匹配的元素。@devnull您是说想要模式中与输入匹配的部分吗?嗨,是的。因此,在我的应用程序中,编译的水果列表是一个regex列表(与条形码连接)。使用re.search时,我需要从与提供的字符串匹配的已编译列表中获取regex对象。这样,我就可以在字符串与特定正则表达式匹配时执行查找操作。到目前为止,我只能找到一种查找匹配项的方法,但无法找到编译对象中匹配的元素。希望有意义:)@devnull