Python基于条件拆分列表值
给定python列表,根据特定条件拆分值:Python基于条件拆分列表值,python,regex,Python,Regex,给定python列表,根据特定条件拆分值: list = ['(( value(name) = literal(luke) or value(like) = literal(music) ) and (value(PRICELIST) in propval(valid))', '(( value(sam) = literal(abc) or value(like) = literal(music) ) and (value(PRICELIST) in pr
list = ['(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))',
'(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))']
现在列表[0]将被删除
(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))
我希望拆分,这样在迭代时,它会给我:
#expected output
value(sam) = literal(abc)
value(like) = literal(music)
如果它以value和literal开头,也是如此。起初我想和and分开,但这不起作用,因为有时可能会缺少and,or
我试过:
for i in list:
i.split()
print(i)
#output ['((', 'value(abc)', '=', 'literal(12)', 'or' ....
我也愿意接受基于正则表达式的建议。但是我对它知之甚少,我不想首先包含它,我建议您避免将变量命名为内置函数。 第二,如果想要获得上述输出,则不需要正则表达式 例如:
first, rest = your_list_[1].split(') and'):
for item in first[2:].split('or')
print(item)
@Duck\u dragon 在开场白中,列表中的字符串的格式导致Python中出现语法错误。在我下面给出的示例中,我将其编辑为使用
''
要更进一步,并为您提供一个可以使用的阵列,请执行以下操作:
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''']
#Declaring blank array found_list which you can use to call the individual items
>>> found_list = []
>>> for item in list:
for element in re.findall('([a-zA-Z]+(?:\()[a-zA-Z]+(?:\))[\s=]+[a-zA-Z]+(?:\()[a-zA-Z]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(sam) = literal(abc)', 'value(like) = literal(music)']
鉴于你下面的评论,我不太明白,这是你想要的吗?我更改了列表,添加了您提到的其他值:
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
>>重新导入
>>>列表=[''”((值(名称)=文字(卢克)或值(like)=文字(音乐))
和(价值(价格表)在propval(有效)中“”,
“(价值(sam)=文字(abc)或价值(like)=文字(音乐))和
(价值(价格表)在Proval(有效)中“,
“'(值(选取SKU1)=propval(._sku)”,“'propval(._amEntitled)>literal(0))”]
>>>已找到\u列表=[]
>>>对于列表中的项目:
对于re.findall(“([\w\.]+(?:\()[\w\.]+(?:\)[\s=(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\))”中的元素,项):
已找到\u列表。追加(元素)
>>>找到你的名单
['value(name)=literal(luke)''value(like)=literal(music)''propval(valid)'value(sam)=literal(abc)''value(like)=literal(music)''value(PICK_SKU1)=propval(music)''propval(music)>literal(0)]
编辑:或者这是您想要的吗?
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''']
#Declaring blank array found_list which you can use to call the individual items
>>> found_list = []
>>> for item in list:
for element in re.findall('([a-zA-Z]+(?:\()[a-zA-Z]+(?:\))[\s=<>(?:in)]+[a-zA-Z]+(?:\()[a-zA-Z]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)']
>>重新导入
>>>列表=[''”((值(名称)=文字(卢克)或值(like)=文字(音乐))
和(价值(价格表)在propval(有效)中“”,
“(价值(sam)=文字(abc)或价值(like)=文字(音乐))和
(价值(价格表)在Proval(有效)中“']
#声明可用于调用单个项的空白数组found\u列表
>>>已找到\u列表=[]
>>>对于列表中的项目:
对于re.findall(“([a-zA-Z]+(?:\()[a-zA-Z]+(?:\)[\s=(?:in)]+[a-zA-Z]+(?:\()[a-zA-Z]+(?:\)”,项中的元素:
已找到\u列表。追加(元素)
>>>找到你的名单
['value(name)=literal(luke)''value(like)=literal(music)''propval(valid)'value(sam)=literal(abc)'value(like)=literal(music)''value(PRICELIST)in propval(valid)'
如果你需要解释,请告诉我
@Fyodor Kutsepin
在您的示例中,取出
您的\u列表
并将其替换为OP的列表
,以避免混淆。其次,您的for循环
缺少一个:
生成语法错误,因此为了避免如此混乱,我将在这篇评论中解释解决方案。我希望没问题。
鉴于您的上述评论,我无法完全理解,这是您想要的吗?我更改了列表,添加了您提到的其他值:
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
>>重新导入
>>>列表=[''”((值(名称)=文字(卢克)或值(like)=文字(音乐))
和(价值(价格表)在propval(有效)中“”,
“(价值(sam)=文字(abc)或价值(like)=文字(音乐))和
(价值(价格表)在Proval(有效)中“,
“'(值(选取SKU1)=propval(._sku)”,“'propval(._amEntitled)>literal(0))”]
>>>已找到\u列表=[]
>>>对于列表中的项目:
对于re.findall(“([\w\.]+(?:\()[\w\.]+(?:\)[\s=(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\))”中的元素,项):
已找到\u列表。追加(元素)
>>>找到你的名单
['value(name)=literal(luke)''value(like)=literal(music)''propval(valid)'value(sam)=literal(abc)''value(like)=literal(music)''value(PICK_SKU1)=propval(music)''propval(music)>literal(0)]
说明:
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
>>> import re
>>> list = ['''(( value(name) = literal(luke) or value(like) = literal(music) )
and (value(PRICELIST) in propval(valid))''',
'''(( value(sam) = literal(abc) or value(like) = literal(music) ) and
(value(PRICELIST) in propval(valid))''',
'''(value(PICK_SKU1) = propval(._sku)''', '''propval(._amEntitled) > literal(0))''']
>>> found_list = []
>>> for item in list:
for element in re.findall('([\w\.]+(?:\()[\w\.]+(?:\))[\s=<>(?:in)]+[\w\.]+(?:\()[\w\.]+(?:\)))', item):
found_list.append(element)
>>> found_list
['value(name) = literal(luke)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(sam) = literal(abc)', 'value(like) = literal(music)', 'value(PRICELIST) in propval(valid)', 'value(PICK_SKU1) = propval(._sku)', 'propval(._amEntitled) > literal(0)']
- 预告-我将
更改为[a-zA-Z0-9\.\]+
,因为它们的意思基本相同,但其中一个更简洁。我将在下一步解释这些查询包含哪些字符[\w\.]+
- 由于
,注意到它是“未关闭”的,这意味着我正在启动正则表达式以捕获以下查询中的所有内容,我告诉它首先捕获范围([\w\.]+
、a-z
和a-z
中的所有字符,以及一个转义周期(
) - 对于
,我是说捕获的查询应该包含一个转义的“开始”括号((?:\()
)(
- 使用
我说的是用第二步中概述的单词字符再次跟随括号,但这次通过[\w\.]+(?:\)
我说的是用转义的“结束”括号跟随括号((?:\)
))
- 这个
有点鲁莽,但是为了可读性和假设字符串将保持相对一致,这表示“右括号”后面应该跟[\s=(?:in)]+
、a“空格”
、a=
或中的单词
,无论它们以任何顺序出现多少次,都是一致的。这是鲁莽的,因为它还将匹配
之类的内容,例如没有说你应该,但你肯定可以在这里使用
解析器:PEG
这就产生了from parsimonious.grammar import Grammar from parsimonious.nodes import NodeVisitor data = ['(( value(name) = literal(luke) or value(like) = literal(music) ) and (value(PRICELIST) in propval(valid))', '(( value(sam) = literal(abc) or value(like) = literal(music) ) and (value(PRICELIST) in propval(valid))'] grammar = Grammar( r""" expr = term (operator term)* term = lpar* factor (operator needle)* rpar* factor = needle operator needle needle = word lpar word rpar operator = ws? ("=" / "or" / "and" / "in") ws? word = ~"\w+" lpar = "(" ws? rpar = ws? ")" ws = ~r"\s*" """ ) class HorribleStuff(NodeVisitor): def generic_visit(self, node, visited_children): return node.text or visited_children def visit_factor(self, node, children): output, equal = [], False for child in node.children: if (child.expr.name == 'needle'): output.append(child.text) elif (child.expr.name == 'operator' and child.text.strip() == '='): equal = True if equal: print(output) for d in data: tree = grammar.parse(d) hs = HorribleStuff() hs.visit(tree)
['value(name)', 'literal(luke)'] ['value(sam)', 'literal(abc)']
您缺少一个
在:
循环之后,您可能需要查看解析,例如这里的for
。不要弄乱正则表达式。此外,这些字符串从何而来?可能只是往上走。IPEG