gpt4 book ai didi

Python - 确认文本文件中的字符串与格式匹配

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:04 24 4
gpt4 key购买 nike

我有一个程序需要将文本文件作为输入并对每行代码执行一些操作。

在我对文本文件执行任何操作之前,我需要确保每一行都匹配特定的格式,在本例中,该格式将是城市名称(可以是任何字符串,不需要是真正的字符串)城市名称)后跟一个“,”,然后是一个数字。

典型的线路如下所示:

towna,2.43

这就是我目前所拥有的,它可以使程序发挥作用,但它不能验证数据是否正确,所以如果它是错误的(并且会时不时地),它就会给我一个错误。我读了一些关于 re.match 的东西,但我不明白如何使用它。

def read_file(fileName):
weatherFile = open(fileName)
for line in weatherFile:
stripped = line.replace(' ','')
pass #add data validation for file
town, rain = stripped.split(",")
if checkIfExists(town):
dataList.append({"city":town, "average_rainfall":float(rain.rstrip())})
else:
print("It looks like {0} is on the list twice. Please ensure all towns in {1} only appear once and try again." .format(town, fileName))
break

最佳答案

在回答之前,我必须指出您在验证开始之前就弄乱了数据。

如果用户输入 Saint Jose,23.0 会怎样?然后代码中的这一行 stripped = line.replace(' ','') 会将其替换为 SaintJose,23.0

无论如何,要解决这个问题,很简单,可以通过一些正则表达式来完成。

import re #python regex

def read_file(fileName):
pattern = re.compile(r'(.*?),([-+]?(?:\d+\.\d*|\.?\d+)(?:[eE][-+]?\d+)?)')
with open(fileName) as weatherFile:
for line in weatherFile:
if not pattern.fullmatch(line.strip()):
continue
town, rain = line.split(",")
if checkIfExists(town):
dataList.append({"city":town, "average_rainfall":float(rain.rstrip())})
else:
print("It looks like {0} is on the list twice. Please ensure all towns in {1} only appear once and try again." .format(town, fileName))
break

您可以使用生成器表达式使其变得更短:

def read_file(fileName):
pattern = re.compile(r'(.*?),([-+]?(?:\d+\.\d*|\.?\d+)(?:[eE][-+]?\d+)?)')
with open(fileName) as weatherFile:
for town, rain in (line.split(",") for line in weatherFile if pattern.fullmatch(line.strip()))
if checkIfExists(town):
dataList.append({"city":town, "average_rainfall":float(rain.rstrip())})
else:
print("It looks like {0} is on the list twice. Please ensure all towns in {1} only appear once and try again." .format(town, fileName))
break

这一行:

pattern = re.compile(r'(.*?),([-+]?(?:\d+\.\d*|\.?\d+)(?:[eE][-+]?\d+)?)')

编译正则表达式以供重用。这对于复杂的正则表达式通常更有效,因此每次使用正则表达式进行匹配时,正则表达式引擎不必重新评估和重建其内部状态。

不预编译正则表达式的匹配等效项是:

re.fullmatch(your_string_expression, r'(.*?),([-+]?(?:\d+\.\d*|\.?\d+)(?:[eE][-+]?\d+)?)')

你看到的可怕的正则表达式(这个([-+]?(?:\d+\.\d*|\.?\d+)(?:[eE][-+]?\d+)?)) 用于匹配整数或 float ,这就是它这么长的原因。 Python 有一些定义的here 。我在这里使用的结合了匹配的整数和 float ,你可以看到它的使用示例 here .

关于Python - 确认文本文件中的字符串与格式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47745944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com