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 中使用的地址解析器有帮助。

posted @ 2023-09-20 16:16  Python探索牛  阅读(272)  评论(0编辑  收藏  举报