Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python基于条件拆分列表值_Python_Regex - Fatal编程技术网

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

给定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 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
    循环之后,您可能需要查看解析,例如这里的
    PEG
    。不要弄乱正则表达式。此外,这些字符串从何而来?可能只是往上走。I