Python 地址解析器

文章目录

    • 使用 Python 库 PyParsing 解析地址
      • 使用 PyParsing 进行简单的地址解析
      • PyParsing 的四个有用函数
    • 在 Python 中使用 PyParsing 从 CSV 文件解析地址


本文将向大家展示如何使用 Python 解析地址。 我们将使用 pyparsing 库手动解析地址,并使用函数或 pyparsing 获取 CSV 文件中的地址。

我们将从一个简单的示例开始,然后转向一个复杂的示例。


使用 Python 库 PyParsing 解析地址

众所周知,Python 编程语言的 pyparsing 模块是对文本数据执行操作的宝贵工具。

用于解析和修改文本数据的 pyparsing 包简化了对地址的处理。 这是因为该模块可以转换并帮助解析地址。

在本文中,我们将讨论 PyParsing 模块用于处理解析和修改的用法。 让我们看一个使用 PyParsing 模块解析地址的真实示例。

之后,我们将查看一个更广泛的示例来演示如何使用 PyParsing 来更改和解析地址数据。

使用 PyParsing 进行简单的地址解析

让我们首先看一个在 Python 库 PyParsing 的帮助下解析地址的基本示例。 作为第一个例子,让我们看看下面的地址并解析它。

567 Main Street

请按照以下步骤解析此地址:

  • 导入pyparsing库

    首先,我们将通过提及 * 导入 pyparsing 库及其所有模块和函数。

from pyparsing import *
  • 创建一个变量

    现在我们将创建一个变量并将其分配给我们要解析的地址。

address = "567 Main Street"
  • 分解

    现在我们将通过提及 nums 和 alphas 来分解地址部分。

addressParser = Word(nums) + Word(alphas) + Word(alphas)
  • 现在我们将创建一个变量并从库 pyparsing 中调用 parseString。
addressParts = addressParser.parseString(address)
  • 打印

    最后,我们将打印变量并查看结果。

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 的四个有用函数

我们可以使用四个可用函数之一来进行实际的解析。

  1. ParseString - 使用 parseString,您可以从头开始解析文本,而不必担心最后出现不必要的内容。
  2. ScanString - ScanString 在输入字符串中搜索匹配的词,有点像 re.finditer()。
  3. SearchString - SearchString 类似于 scanString,不同之处在于它不是返回单个标记,而是提供它们的集合。
  4. TransformString - TransformString 类似于 scanString 但允许您用您选择的其他标记替换标记。

在 Python 中使用 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 = Word(alphanums)('key')

我们想从 CSV 文件的输出中删除 = 符号。 我们将使用抑制功能。

equals = Suppress('=')

现在,我们将为值部分创建一个变量。 同样,我们会提到字母数字,因为地址数据集可以包含字母和数字。

value = Word(alphanums)('value')

现在,我们将创建另一个变量来连接变量。

keyValueExpression = key + equals + value

现在我们将使用文件格式打开地址的 CSV 文件。 并使用 file.read 函数读取文件中的每个数据。

with open('/address.csv') as address_file:
  address_file = address_file.read()

在此之后,我们将使用带有 scanString 函数或 pyparsing 的 for 循环来逐行读取地址的每一行。

for adrs in keyValueExpression.scanString(address_file):
  result = adrs[0]

最后,我们将使用打印功能来查看结果。

print("{0} is {1}".format(result.key, result.value))

我们的代码到此结束,现在我们将编写完整的代码来运行它。 并查看当我们提供包含地址的 CSV 文件时会得到什么输出。

#import library
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 提供了一种比正则表达式更强大、更成熟的替代方法。

例如,嵌套字段对于 PyParsing 没有问题,但它们对于正则表达式来说是问题。 这个解析器更像是旧的备用工具,如 lex 和 yacc。

换句话说,正则表达式可用于搜索标签和从 HTML 中提取数据,但它们不能用于验证 HTML 文件。 然而,pyparsing 可以让你完成这个。

我们希望您发现本文有助于理解 Python 中使用的地址解析器。

你可能感兴趣的:(Python,实用技巧,python,开发语言)