Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 使用re.findall捕获正则表达式中的命名组_Python_Regex_Findall - Fatal编程技术网

Python 使用re.findall捕获正则表达式中的命名组

Python 使用re.findall捕获正则表达式中的命名组,python,regex,findall,Python,Regex,Findall,当我试图回答这个问题时:我注意到我必须根据findall的结果重新排序组。例如: data = """34% passed 23% failed 46% deferred""" result = {key:value for value, key in re.findall('(\w+)%\s(\w+)', data)} print(result) >>> {'failed': '23', 'passed': '34', 'deferred': '46'} 在这里,finda

当我试图回答这个问题时:我注意到我必须根据findall的结果重新排序组。例如:

data = """34% passed 23% failed 46% deferred"""
result = {key:value for value, key in re.findall('(\w+)%\s(\w+)', data)}
print(result)
>>> {'failed': '23', 'passed': '34', 'deferred': '46'}
在这里,findall的结果是:

>>> re.findall('(\w+)%\s(\w+)', data)
>>> [('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
是否有方法更改/指定使re.findall返回的组的顺序

[('passed', '34'), ('failed', '23'), ('deferred', '46')]
我想澄清一下,问题是:

是否可以为re.findall函数的返回指定顺序或重新排序组

我使用上面的示例创建了一个字典,以提供您想要更改顺序的原因/用例(将key设置为value,将value设置为key)

进一步澄清:


为了在更大更复杂的正则表达式中处理组,您可以命名组,但只有在执行re.search pr re.match时才能访问这些名称。据我所知,findall对元组中返回的组有一个固定的索引,问题是有人知道如何修改这些索引。这将有助于简化和直观地处理组。

正如您在第二个示例中所指出的,
re.findall
按原始顺序返回组

问题在于标准Python
dict
类型没有以任何方式保留键的顺序。下面是Python 2.x的手册,它使其显式化,但在Python 3.x中仍然如此:

您应该使用的是:

请注意,必须使用成对构造函数(
dict((k,v)表示k,v in…
)而不是
dict
理解构造函数(
{k:v表示k,v in…}
)。这是因为后者构造了
dict
类型的实例,如果不丢失键的顺序,就无法将其转换为
orderedict
,这当然是您首先要保留的。

Per:如果您只是尝试对这样的2元组列表重新排序:

[('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
…如图所示,单个元素颠倒:

[('passed', '34'), ('failed', '23'), ('deferred', '46')]
有一个简单的解决方案:使用切片语法
sequence[::-1]
的列表理解来反转各个元组元素的顺序:

a = [('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
b = [x[::-1] for x in a]
print b

以3为例,基于对OP的意图的进一步澄清

Ashwin认为
findall
不保留命名的捕获组(例如
(?Pregex)
)是正确的。为了救援!它逐个返回单个匹配对象。简单示例:

data = """34% passed 23% failed 46% deferred"""
for m in re.finditer('(?P<percentage>\w+)%\s(?P<word>\w+)', data):
    print( m.group('percentage'), m.group('word') )
data=”““34%通过23%失败46%延迟”“”
对于m in re.finditer('(?P\w+)%\s(?P\w+),数据:
打印(m.group('percentage')、m.group('word'))

我想知道我是否可以指定或更改re.findall返回的原始顺序。转换为dict只是我想对组重新排序的一个例子。您的问题根本不清楚您试图重新排序的内容。请编辑它以澄清这一点。更新:Python
dict
保留了关键字ord更新版本的Python(另请参见)我知道如何对元组重新排序,问题是如何指定re.findall的顺序。
re findall
的顺序?我将向您展示如何获取
re.findall
的输出,并将其更改为您所希望的顺序。为了在更大更复杂的正则表达式中处理组,您可以命名组,但这些名称是e只有在您进行重新搜索或重新匹配时才可访问。据我所知,findall对元组中返回的组有一个固定的索引,问题是任何人都知道如何修改这些索引。这将有助于更轻松直观地处理组。啊,命名组是一个单独的问题(也不在您的问题中)。您的回答是正确的,
findall
只返回捕获的组,而忽略名称;但是您可以简单地使用,而不是返回匹配对象,通过它您将能够访问命名组。先生,这正是我所寻找的。如果您可以添加/修改您的答案,我将接受它。感谢您不可能更改g的顺序由
findall
返回的组,但在我的第二个回答中显示的事实之后很容易对它们重新排序:这是我假设的,但找不到说明这一点的文档。因此,我在这里提出问题。
data = """34% passed 23% failed 46% deferred"""
for m in re.finditer('(?P<percentage>\w+)%\s(?P<word>\w+)', data):
    print( m.group('percentage'), m.group('word') )