Python用于解析和修改文本数据-pyparsing模块教程
Python库解析地址PyParsing
人们普遍认为,Python编程语言的pyparsing 模块是对文本数据进行操作的一个宝贵工具。
用于解析和修改文本数据的pyparsing 包,简化了对地址的操作。这是因为该模块可以转换和帮助解析地址。
在这篇文章中,我们将讨论PyParsing 模块在处理解析以及修改时的用法。让我们看看一个使用PyParsing 模块解析地址的真实例子。
之后,我们将看一个更广泛的例子,以证明PyParsing 如何被用来改变和解析地址数据。
用简单的地址解析PyParsing
让我们首先看看在Python库PyParsing 的帮助下解析地址的一个基本例子。作为第一个例子,让我们看一下下面的地址并对其进行解析。
567 Main Street
按照这些步骤来解析这个地址:
1.导入pyparsing 库
首先,我们将通过提及* 来导入pyparsing 库及其所有的模块和函数。
from pyparsing import *
2.创建一个变量
现在我们将创建一个变量,并将其分配给我们要解析的地址。
address = "567 Main Street"
3.分解
现在我们将通过提及nums 和alphas 来分解地址部分。
addressParser = Word(nums) + Word(alphas) + Word(alphas)
现在我们将创建一个变量并从库pyparsing 中调用parseString 。
addressParts = addressParser.parseString(address)
4.打印
最后,我们将打印该变量并查看结果。
print(addressParts)
让我们写下整个代码并运行它来看看结果。
from pyparsing import *
address = "123 Main Street FL"
addressParser = Word(nums) + Word(alphas) + Word(alphas) + Word(alphas)
addressParts = addressParser.parseString(address)
print(addressParts)
输出:
['123', 'Main', 'Street', 'FL']
这段代码将把地址解析成四个部分:街道号码、街道名称、街道类型和地址所在的州。
街道号码将是第一部分,街道名称将是第二部分,街道类型将是第三部分,而州将是最后一部分。
四个有用的功能PyParsing
我们可以使用四个可用的函数之一来进行实际解析。
- ParseString – 通过parseString ,你可以从头开始解析文本,而不必担心结尾的不必要的内容。
- ScanString – ScanString 搜索输入字符串中的匹配词,有点像re.finditer() 。
- SearchString – SearchString 与scanString 相似,只是它不返回单个标记,而是提供一个标记的集合。
- TransformString – TransformString 类似于scanString ,但允许你用你选择的其他标记代替。
用PyParsing 从CSV文件解析地址
地址信息是CSV文件中经常记录的一个特定数据。因为它们在结构上有很大的不同,所以可能很难解析。
pyparsing 模块使用定义的结构简化了从CSV文件中提取地址的过程。首先,让我们为如何正确解析地址定义几个直接的准则和函数。
之后,我们将把这些原则应用于解析含地址的CSV文件。
假设我们的配置文件或地址的CSV文件看起来像这样:
city=LAUDERDALE, state=FL, Zipcode: 33316
我们将不得不以key=value 格式来解析这个字符串。一个KEY=VALUE 字符串有三个部分:键、等号和值。
在解析这样一个表达式的最终输出中包括等号是不必要的。可以使用Suppress() 方法来防止标记被包括在输出中。
代号的名称可以由setResultsName() 函数提供,也可以在构建解析器时将名称作为参数调用解析器,这使得检索特定的代号变得稍微简单明了。令牌最好有与之相关的名称。
让我们试试这段代码,看看pyparsing 如何与CSV文件一起工作。
我们将首先导入pyparsing 库及其所有的函数和模块。
from pyparsing import *
其次,我们将为输入的key 部分创建一个变量,用于输出。我们会提到alphanums ,因为地址的数据集可以包含字母和数字。
key = Word(alphanums)('key')
我们想从CSV文件的输出中删除= 符号。我们将使用Suppress 函数。
equals = Suppress('=')
现在,我们将为value 部分制作一个变量。而且,我们将再次提到alphanums ,因为地址的数据集可以包含字母和数字。
value = Word(alphanums)('value')
现在,我们将创建另一个变量来串联这些变量。
keyValueExpression = key + equals + value
现在我们将使用文件格式化打开我们的CSV地址文件。并使用file.read 函数来读取文件中的每个数据。
with open('/address.csv') as address_file:
address_file = address_file.read()
在这之后,我们将使用for 循环与scanString 函数或pyparsing 来逐一读取地址的每一行。
for adrs in keyValueExpression.scanString(address_file):
result = adrs[0]
最后,我们将使用print 函数来查看结果。
print("{0} is {1}".format(result.key, result.value))
我们的代码到此结束,现在我们将写下整个代码来运行它。并看看当我们提供一个带有地址的CSV文件时,我们会得到什么输出。
#import library
#Python小白学习交流群:153708845
from pyparsing import *
key = Word(alphanums)('key')
#delet = from the output
equals = Suppress('=')
value = Word(alphanums)('value')
keyValueExpression = key + equals + value
#use file formating to open csv file
with open('/content/address.csv') as address_file:
address_file = address_file.read()
#use for loop to read your CSV file
for adrs in keyValueExpression.scanString(address_file):
result = adrs[0]
#print the output
print("{0} is {1}".format(result.key, result.value))
输出:
city is LAUDERDALE
state is FL
代码的输出显示了我们的文件所包含的数据。在address.csv 文件中,我们只有一个地址。
而且你可以看到使用pyparsing 库的功能,因为地址被解析了。
PyParsing 在将文本解析为标记并检索或替换单个标记时,”L “提供了一个比正则表达式更强大和成熟的替代方案。
例如,嵌套字段对PyParsing ,但对正则表达式来说是没有问题的。这个分析器更像是老式的备用程序,如lex 和yacc 。
换句话说,正则表达式可以用来搜索标签并从HTML中提取数据,但它们不能用来验证HTML文件。然而,pyparsing 将允许你完成这个任务。
我们希望你觉得这篇文章对理解 Python 中使用的地址解析器有帮助。