【问题标题】:How do I find if anything in a list is in a string and determine what that "anything" is?如何查找列表中的任何内容是否在字符串中并确定“任何内容”是什么?
【发布时间】:2016-12-04 02:57:25
【问题描述】:

我需要从用户输入中读取数据并将其解析为 3 部分,第一部分是行值,第二部分是条件(==,!=,> 等),第三部分是比较-价值。 用户输入:0=="6/1/2014 0:00:00" --> 因此,行为 0,条件为“==”,比较值为“6/1/2014 0:00 :00"

这是我所拥有的:

    promptList = ["0 == 6/12/16 00:00:00", "1 > 47.20"]
    for prompt in promptList:
    if any(comparator in prompt for comparator in comparatorsList):
        prompt = prompt.split(comparator)
        row = prompt[0].strip()
        condition = prompt[1].strip()
        comparator = str(comparator).strip()
        print(row, comparator, condition) #test to see print statement, not needed

但是,它说我没有定义比较器。我需要比较器来知道用什么分割字符串,因为你永远不知道比较器会出现在哪里(即:0 == 0 VS. 20124 > 6/2/12 00:32:10)

如何设置我的 3 个变量!

【问题讨论】:

    标签: python list for-loop user-input string-parsing


    【解决方案1】:

    变量comparator 的范围在您的生成器理解范围内,并且不会存在于它之外。与其使用any 构造,后者在这里丢弃了有价值的信息,即实际包含哪个比较器,您可以将其扩展为一个 for 循环:

    comparatorsList = set(["==", "!=", ">", ">=", "<=", "<"])
    promptList = ["0 == 6/12/16 00:00:00", "1 > 47.20"]
    
    for prompt in promptList:
        for comparator in comparatorsList:
            if comparator in prompt:
                prompt = prompt.split(comparator)
                row = prompt[0].strip()
                condition = prompt[1].strip()
                comparator = str(comparator).strip()
                print(row, comparator, condition) 
                break
    

    打印:

    ('0', '==', '6/12/16 00:00:00')
    ('1', '>', '47.20')
    

    【讨论】:

      【解决方案2】:

      您在任何使用的推导中定义了comparator 变量,因此其范围仅限于此推导的范围。

      你可以替换

      if any(comparator in prompt for comparator in comparatorsList):
      

      类似的东西

      comparator = next((x for x in comparatorsList if x in prompt), None)
      if comparator is not None:
      

      或者你可以简单地使用正则表达式。您没有对左右值指定任何约束,所以我假设它们可以是任何值:

      import re
      rv = re.match("(.*)(==|!=|>)(.*)", "6 == 2")
      

      rv.groups() 将有匹配的组,第一个具有左值,第二个具有比较值,第三个具有右值。您可以微调此正则表达式以限制左右值类型。

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 2013-04-08
        相关资源
        最近更新 更多