[英]Python re: Storing multiple matches in variables
我想匹配字符串的不同部分并将它们存储在单独的变量中以供以后使用。 例如,
string = "bunch(oranges, bananas, apples)"
rxp = "[a-z]*\([var1]\, [var2]\, [var3]\)"
所以我有
var1 = "oranges"
var2 = "bananas"
var3 = "apples"
像re.search()那样的东西,但同一匹配的多个不同部分。
编辑:事先不知道列表中的水果数量。 应该把这个问题提出来。
这就是re.search
所做的。 只需使用捕获组(括号)来访问稍后由某些子模式匹配的内容:
>>> import re
>>> m = re.search(r"[a-z]*\(([a-z]*), ([a-z]*), ([a-z]*)\)", string)
>>> m.group(0)
'bunch(oranges, bananas, apples)'
>>> m.group(1)
'oranges'
>>> m.group(2)
'bananas'
>>> m.group(3)
'apples'
另请注意,我使用原始字符串来避免双反斜杠。
如果你的内部“变量”的数量bunch
可以改变,你有问题。 大多数正则表达式引擎无法捕获可变数量的字符串。 但是在这种情况下你可以逃脱这个:
>>> m = re.search(r"[a-z]*\(([a-z, ]*)\)", string)
>>> m.group(1)
'oranges, bananas, apples'
>>> m.group(1).split(', ')
['oranges', 'bananas', 'apples']
如果需要,可以使用groupdict
在字典中存储匹配项:
regex = re.compile("[a-z]*\((?P<var1>.*)\, (?P<var2>.*)\, (?P<var3>.*)")
match = regex.match("bunch(oranges, bananas, apples)")
if match:
match.groupdict()
#{'var1': 'oranges', 'var2': 'bananas', 'var3': 'apples)'}
对于正则表达式,您可以使用match()
函数执行所需操作,并使用组来获取结果。 另外,不要分配单词string
,因为这是一个内置函数(即使它已被弃用)。 举个例子,如果你知道每次都有相同数量的水果,它看起来像这样:
import re
input = "bunch(oranges, bananas, apples)"
var1, var2, var3 = re.match('bunch\((\w+), (\w+), (\w+)\)', input).group(1, 2, 3)
在这里,我使用\\w
特殊序列,它匹配任何字母数字字符或下划线,如文档中所述
如果您事先不知道水果的数量,可以使用两个正则表达式调用,一个用于提取列出水果的字符串的最小部分,去除“束”和括号,然后finditer
提取水果的名称:
import re
input = "bunch(oranges, bananas, apples)"
[m.group(0) for m in re.finditer('\w+(, )?', re.match('bunch\(([^)]*)\)', input).group(1))]
别。 每次使用var1,var2等时,实际上都需要一个列表。 不幸的是,这不能使用findall
在列表中收集任意数量的子组,但你可以使用这样的hack:
import re
lst = []
re.sub(r'([a-z]+)(?=[^()]*\))', lambda m: lst.append(m.group(1)), string)
print lst # ['oranges', 'bananas', 'apples']
请注意,这不仅适用于此特定示例,也适用于任意数量的子字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.