gpt4 book ai didi

python - 正则表达式解析字符串

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

我正在努力正确解析文本。文本中有很多变化。理想情况下,我想在 Python 中执行此操作,但任何语言都可以。

示例字符串:

  • “如果魔术代码是 543,并且类型是 5642、912342 或 7425,则类型必须有句点。例如:02-15-99”
  • “如果 Magic Code 为 722、43 或 643256,类型为 43234、5356 和 2112,则类型必须以句点开头。”
  • “如果魔术代码是 4542,则其类型无效。”
  • “如果幻码为 532,日期距当前数据 10 年内,且类型为 43,则类型必须以法律数字开头。”

我想要的结果:

  • [543] [5642, 912342, 7425][类型必须有句点。]
  • [722、43、643256][3234、5356 和 2112][类型必须以句点开头。]
  • [4542][类型无效。]
  • [532][43][类型必须以法律编号开头。]

还有其他变体,但你明白这个概念。抱歉,我不太擅长正则表达式。

最佳答案

嗯...这就是你所要求的。但它非常丑陋,并且非常具体于您提供的示例。我怀疑它会针对真实数据文件失败。

当面对这种解析工作时,解决问题的一种方法是通过一些初步清理来运行输入数据,尽可能简化和合理化文本。例如,处理不同风格的整数列表很烦人,并且会使正则表达式变得更加复杂。如果您可以删除整数之间不必要的逗号并删除终端“或和”,则正则表达式会变得更简单。完成这种清理后,有时您可以应用一个或多个正则表达式来提取所需的位。在某些情况下,可以通过特定的查找或硬编码的特殊情况规则来处理不满足主要正则表达式的异常值的数量。

import re

lines = [
"if magic code is 543, and type is 5642, 912342, or 7425, type has to have a period. EX: 02-15-99",
"If Magic Code is 722, 43, or 643256 and types is 43234, 5356, and 2112, type has to start with period.",
"if magic code is 4542 it is not valid in type.",
"if magic code is 532 and date is within 10 years from current data, and the type is 43, the type must begin with law number.",
]

mcs_rgx = re.compile(r'magic code is (\d+ (or|and) \d+|\d+(, \d+)*,? (or|and) \d+|\d+)', re.IGNORECASE)
types_rgx = re.compile(r'types? is (\d+ (or|and) \d+|\d+(, \d+)*,? (or|and) \d+|\d+)', re.IGNORECASE)
rest_rgx1 = re.compile(r'(type (has|must).+)')
rest_rgx2 = re.compile(r'.+\d(.+)')
nums_rgx = re.compile(r'\d+')

for line in lines:

m = mcs_rgx.search(line)
if m:
mcs_text = m.group(1)
mcs = map(int, nums_rgx.findall(mcs_text))
else:
mcs = []

m = types_rgx.search(line)
if m:
types_text = m.group(1)
types = map(int, nums_rgx.findall(types_text))
else:
types = []

m = rest_rgx1.search(line)
if m:
rest = [m.group(1)]
else:
m = rest_rgx2.search(line)
if m:
rest = [m.group(1)]
else:
rest = ['']

print mcs, types, rest

输出:

[543] [5642, 912342, 7425] ['type has to have a period. EX: 02-15-99']
[722, 43, 643256] [43234, 5356, 2112] ['type has to start with period.']
[4542] [] [' it is not valid in type.']
[532] [43] ['type must begin with law number.']

关于python - 正则表达式解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40777155/

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