我希望匹配字符串的不同部分并将它们存储在单独的变量中以供以后使用。例如,
string = "bunch(oranges, bananas, apples)"
rxp = "[a-z]*\([var1]\, [var2]\, [var3]\)"
所以我有
var1 = "oranges"
var2 = "bananas"
var3 = "apples"
类似于re.search()的内容,但同一匹配的多个不同部分。
编辑:事先不知道列表中的水果数量。应该把这个问题提出来。
答案 0 :(得分:4)
这就是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']
答案 1 :(得分:4)
如果需要,可以使用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)'}
答案 2 :(得分:2)
对于正则表达式,您可以使用match()
函数执行所需操作,并使用组来获取结果。另外,不要分配单词string
,因为这是一个内置函数(即使它已被弃用)。例如,如果你知道每次都有相同数量的水果,它看起来像这样:
import re
input = "bunch(oranges, bananas, apples)"
var1, var2, var3 = re.match('bunch\((\w+), (\w+), (\w+)\)', input).group(1, 2, 3)
在这里,我使用了\w
特殊序列,它匹配任何字母数字字符或下划线,如the documentation
如果您事先不知道水果的数量,可以使用两个正则表达式调用,一个用于提取列出水果的字符串的最小部分,去除“束”和括号,然后finditer
提取水果的名称:
import re
input = "bunch(oranges, bananas, apples)"
[m.group(0) for m in re.finditer('\w+(, )?', re.match('bunch\(([^)]*)\)', input).group(1))]
答案 3 :(得分:1)
别。每次使用var1,var2等时,实际上都需要一个列表。不幸的是,这无法使用findall
在列表中收集任意数量的子组,但您可以使用这样的黑客:
import re
lst = []
re.sub(r'([a-z]+)(?=[^()]*\))', lambda m: lst.append(m.group(1)), string)
print lst # ['oranges', 'bananas', 'apples']
请注意,这不仅适用于此特定示例,也适用于任意数量的子字符串。