如何获取字符串中的值?

2024-05-15 11:16:40 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在Python中从这个长字符串中提取STOP_DATE值?你知道吗

GROUP                  = TEMPORALINFORMATION

OBJECT                 = PRODUCTIONDATETIME
  NUM_VAL              = 1
  VALUE                = "2015-07-19T18:29:43Z"
END_OBJECT             = PRODUCTIONDATETIME

OBJECT                 = START_DATE
  NUM_VAL              = 1
  VALUE                = "2015-07-11T20:17:22Z"
END_OBJECT             = START_DATE

OBJECT                 = STOP_DATE
  NUM_VAL              = 1
  VALUE                = "2015-07-11T21:03:52Z"
END_OBJECT             = STOP_DATE

END_GROUP              = TEMPORALINFORMATION

Tags: 字符串dateobjectvaluegroupvalstartnum
3条回答

如其他人所示,您可以将其作为一个单行正则表达式来执行,但这更清楚:

import re
input_data="""  GROUP                  = TEMPORALINFORMATION\n\n    OBJECT                 = PRODUCTIONDATETIME\n      NUM_VAL              = 1\n      VALUE                = "2015-07-19T18:29:43Z"\n    END_OBJECT             = PRODUCTIONDATETIME\n\n    OBJECT                 = START_DATE\n      NUM_VAL              = 1\n      VALUE                = "2015-07-11T20:17:22Z"\n    END_OBJECT             = START_DATE\n\n    OBJECT                 = STOP_DATE\n      NUM_VAL              = 1\n      VALUE                = "2015-07-11T21:03:52Z"\n    END_OBJECT             = STOP_DATE\n\n  END_GROUP              = TEMPORALINFORMATION
"""

def find_stop_date(s):
    in_stop_date=False
    result=None
    for line in s.split("\n"):
        line = line.strip()
        if re.search(r"^OBJECT.*=.*STOP_DATE", line):
            in_stop_date=True
        if re.search(r"^END_OBJECT.*=.*STOP_DATE", line):
            in_stop_date=False
        if in_stop_date:
            re_result = re.search("VALUE\s*=\s*(.*)", line)
            if (re_result):
                result = re_result.group(1)

    return result

result = find_stop_date(input_data)
if result:
    print("Found: {}".format(result))
else:
    print("not found")

您可以使用以下正则表达式:

STOP_DATE.+?VALUE\s*=\s*\"(.+?)\"

Python命令:

import re

regex = r"STOP_DATE.+?VALUE\s*=\s*\"(.+?)\""

match = re.search(regex, test_str, re.DOTALL)
print(match.group(1))

其中test_str是字符串的名称。你知道吗

结果是:

2015-07-11T21:03:52Z

Try it online.

Sven的答案并没有那么精确,我的模式将运行快5倍,并且可以省略DOTALL标志:STOP_DATE[^"]+"([^"]+)

import re

test_str = '''GROUP                  = TEMPORALINFORMATION

    OBJECT                 = PRODUCTIONDATETIME
      NUM_VAL              = 1
      VALUE                = "2015-07-19T18:29:43Z"
    END_OBJECT             = PRODUCTIONDATETIME

    OBJECT                 = START_DATE
      NUM_VAL              = 1
      VALUE                = "2015-07-11T20:17:22Z"
    END_OBJECT             = START_DATE

    OBJECT                 = STOP_DATE
      NUM_VAL              = 1
      VALUE                = "2015-07-11T21:03:52Z"
    END_OBJECT             = STOP_DATE

    END_GROUP              = TEMPORALINFORMATION'''

print re.search( r'STOP_DATE[^"]+"([^"]+)', test_str).group(1)
# 2015-07-11T21:03:52Z

性能提升来自于使用两个贪婪的“否定捕获类”而不是dots。你知道吗

由于所需的子字符串是紧跟在STOP_DATE后面的唯一双引号值,因此双引号是唯一需要标识的字符。你知道吗

如果您的实际数据有其他双引号的值,并且您需要指定VALUE,那么您可以使用:STOP_DATE[^"]+VALUE[^"]+"([^"]+),但是所需的步骤会膨胀到我以前模式的2.5倍(但仍然比Sven的快2倍)。你知道吗

相关问题 更多 >