
本文旨在提供一种更高效且简洁的正则表达式,用于从文本数据中精确提取占星宫位信息,包括宫位编号或名称、星座符号以及精确的度分秒坐标。通过优化复杂的或语句,新模式显著提升了正则匹配的清晰度和可维护性,同时确保了数据提取的准确性。
在处理特定格式的文本数据时,正则表达式是强大的工具。对于从占星图PDF中提取宫位数据这类任务,构建一个既准确又高效的正则表达式至关重要。本教程将深入探讨如何优化一个用于提取占星宫位数据的正则表达式,以提高其可读性和匹配效率。
假设我们有以下格式的占星宫位数据:
Houses (Plac.) Declination Asc. j 3°23'49" 23°23'37" S 2 k 13°38'12" 16°43'48" S 3 l 25°39'11" 1°43'39" S IC a 28°32'56" 10°57'28" N 5 b 23° 5'14" 18°32'35" N 6 c 13°27'11" 22°24'45" N Desc. d 3°23'49" 23°23'37" N 8 e 13°38'12" 16°43'48" N 9 f 25°39'11" 1°43'39" N MC g 28°32'56" 10°57'28" S 11 h 23° 5'14" 18°32'35" S 12 i 13°27'11" 22°24'45" S
我们的目标是从每一行中提取三个关键信息:宫位编号或名称(如 "Asc."、"2"、"IC")、星座符号(如 "j"、"k"、"a")以及精确的度分秒坐标(如 "3°23'49"")。
一个初始的正则表达式模式可能是这样的:
house_pattern = r'([A-Z]{2}|[A-Z][a-z]+\.|[0-9]|[0-9]{2})\s+([a-z])\s+(\d+°+.\d+\'+.\d+\")'这个模式虽然可以实现预期结果,但在第一个捕获组 ([A-Z]{2}|[A-Z][a-z]+\.|[0-9]|[0-9]{2}) 中存在明显的优化空间。它使用了多个过于具体的 OR 条件来匹配宫位编号或名称:
这种写法冗长且不易维护。如果出现新的宫位名称格式,就需要不断修改这个复杂的 OR 组。此外,第三个捕获组 (\d+°+.\d+\'+.\d+\") 中的 .+ 匹配任何字符,可能导致意外匹配,并且 + 修饰符在 ° 和 . 之后也略显多余或不准确。
为了解决上述问题,我们可以采用一个更简洁、更具鲁棒性的正则表达式。优化的模式如下:
optimized_pattern = r'(\S+)\s+([a-z])\s+(\d+°\s*\d+\'\d+")'
让我们逐一分析这个优化后的模式:
第一个捕获组:(\S+)
空白字符匹配:\s+
第二个捕获组:([a-z])
空白字符匹配:\s+
*第三个捕获组:`(\d+°\s\d+\'\d+")`**
这个优化后的模式不仅更加简洁,而且通过 \s* 的引入,对数据格式变化的容忍度更高,例如度分秒之间可能存在的空格。
下面是使用Python的 re 模块结合优化模式提取数据的示例:
import re
# 示例数据集
data = """
Houses (Plac.) Declination
Asc. j 3°23'49" 23°23'37" S
2 k 13°38'12" 16°43'48" S
3 l 25°39'11" 1°43'39" S
IC a 28°32'56" 10°57'28" N
5 b 23° 5'14" 18°32'35" N
6 c 13°27'11" 22°24'45" N
Desc. d 3°23'49" 23°23'37" N
8 e 13°38'12" 16°43'48" N
9 f 25°39'11" 1°43'39" N
MC g 28°32'56" 10°57'28" S
11 h 23° 5'14" 18°32'35" S
12 i 13°27'11" 22°24'45" S
"""
# 优化后的正则表达式
optimized_pattern = r'(\S+)\s+([a-z])\s+(\d+°\s*\d+\'\d+")'
# 使用 re.findall 查找所有匹配项
# re.MULTILINE 标志可以使 ^ 和 $ 匹配每一行的开头和结尾,但在此例中不是严格必需,
# 因为我们只是在整个字符串中查找模式。
matches = re.findall(optimized_pattern, data)
# 打印结果
for match in matches:
print(match)
输出结果:
('Asc.', 'j', '3°23\'49"')
('2', 'k', '13°38\'12"')
('3', 'l', '25°39\'11"')
('IC', 'a', '28°32\'56"')
('5', 'b', '23° 5\'14"')
('6', 'c', '13°27\'11"')
('Desc.', 'd', '3°23\'49"')
('8', 'e', '13°38\'12"')
('9', 'f', '25°39\'11"')
('MC', 'g', '28°32\'56"')
('11', 'h', '23° 5\'14"')
('12', 'i', '13°27\'11"')可以看到,优化后的模式成功地提取了所有所需的数据,并且输出格式与预期完全一致。
通过本次优化,我们不仅获得了准确的数据提取结果,更重要的是,学习了如何通过简化模式、提高通用性以及精确匹配来编写更优雅、更高效的正则表达式。这对于任何需要从非结构化或半结构化文本中提取信息的任务都具有指导意义。
以上就是优化占星宫位数据提取的正则表达式的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号