我試圖在 python 中執行一個簡單的正則運算式模式匹配來判斷輸入字串是否是逗號分隔的串列。輸入串列的示例是,
input = '[1]'
input = "['Yes']"
input = '["Yes"]'
input = '["Yes",1,"No"],["HIGH","MEDIUM","LOW"]'
input = "[1,2,3], ['High', 'Medium', 'Low']"
等等。現在,當我嘗試匹配單個串列的正則運算式模式時,它可以正常作業。因此,對于單個串列,我執行以下操作,
import re
pattern = re.compile(r'^\[(((\". \")|(\'. \')|(\d )),?) \]$')
input = '["Yes", 12, "No"]'
print(pattern.match(input))
print(pattern.match(input).string)
我得到了想要的輸出
<re.Match object; span=(0, 17), match='["Yes", 12, "No"]'>
["Yes", 12, "No"]
但是,用于在包含多個串列的字串上測驗類似的模式。
import re
pattern = re.compile(r'^((\[(((\". \")|(\'. \')|(\d )),?) \]),?) $')
input = "[1,2,3],['High','Medium','Low']"
print(pattern.match(input))
print(pattern.match(input).string)
這作業正常,我得到以下輸出。
<re.Match object; span=(0, 31), match="[1,2,3],['High','Medium','Low']">
[1,2,3],['High','Medium','Low']]
但是,如果我想使用正則運算式 findall 方法查找單個串列,它就不起作用。所以,如果我執行以下操作。請注意,下面的模式適用于沒有行開頭 ^ 和行結尾 $ 符號的單個串列項。
import re
pattern = re.compile(r'\[(((\". \")|(\'. \')|(\d )),?) \]')
input = "[1,2,3],['High','Medium','Low']"
pattern.findall(input)
我得到輸出:
[('3', '3', '', '', '3'),
("'High','Medium','Low'",
"'High','Medium','Low'",
'',
"'High','Medium','Low'",
'')]
所以匹配完全忽略了串列[1,2,3]。此外,對于匹配 'High'、'Medium'、'Low' 缺少以 '[' 開頭和以 ']' 結尾的串列。
另外,我想知道是否有更好的方法來撰寫這個正則運算式而不使用 ast.literal_eval。
uj5u.com熱心網友回復:
您可以使用r'(\[(((\". \")|(\'. \')|(\d )),?) \])'作為模式,然后提取所需的匹配,即
pattern = re.compile(r'(\[(((\". \")|(\'. \')|(\d )),?) \])')
matches = list(map(lambda x:x[0], pattern.findall(s)))
然后比賽將是['[1,2,3]', "['High','Medium','Low']"]
uj5u.com熱心網友回復:
我不認為我完全了解這一切,對于我的任何誤解,我深表歉意。
我嘗試使用該模式(\[. ?\]),?并re.findall()得到以下輸出:
import re
pattern = re.compile(r'(\[. ?\]),?')
input = "[1,2,3], ['High', xyz'Medium','Low']"
>>> pattern.findall(input)
['[1,2,3]', "['High', xyz'Medium','Low']"]
這是你想要得到的嗎?
uj5u.com熱心網友回復:
這最終奏效了:
import re
pattern = re.compile(r'(\[(((\"[^,\"\'\[\]] \")|(\'[^,\"\'\[\]] \')|(\d )),?\s?) \])')
input = "[1,2,3], [1,2,'Low'], ['High', 'Medium','Low']"
matches = list(map(lambda x:x[0] if type(x) is tuple else x, pattern.findall(input)))
matches
輸出:
['[1,2,3]', "[1,2,'Low']", "['High', 'Medium','Low']"]
如果您在輸入的其中一個串列中提供垃圾值,則不會考慮它。例如,如果輸入是:
input = "[1,2,3], [1,2,'Low'], ['High', xyz'Medium','Low']"
輸出將僅包含有效串列:
['[1,2,3]', "[1,2,'Low']"]
我根據@Konny 提供的答案提出了這個解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433695.html
