簡體   English   中英

Python re:在變量中存儲多個匹配項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM