首页 > 解决方案 > 使用正则表达式在标签和标签列表之间查找元素

问题描述

我想在两个不同的标签之间找到元素,但要注意的是第一个标签是不变的,但第二个标签可以是属于特定列表的任何标签。

例如一个字符串

'TRSF BOOK TRANSFER CREDIT SND= abcd bank , 123  ORG= qwer123 OGB= qwerasd OBI= 123433'

我有一个标签列表['TRSF','SND=','ORG=','OGB=','OBI=']

编辑:在列表本身中添加了“=”的可用性

我的输出应该看起来像这样

TRSF : BOOK TRANSFER CREDIT 
SND : abcd bank , 123
ORG : qwer123
OGB : qwerasd
OBI : 123433

标签的顺序以及标签的可用性可能会改变,新标签也可能会出现在图片中

到目前为止,我正在为每种类型编写单独的正则表达式和字符串解析代码,但这似乎不切实际,因为组合可以是无限的

这是我在做什么:

org = re.findall("ORG=(.*?) OGB=",string_1)
snd = re.findall("SND=(.*?) ORG=",string_1)
,,obi = string_1.partition('OBI=')

有什么办法可以做到

<tag>(.*?)<tag in list>

或任何其他方法?

标签: pythonregexstring

解决方案


如果标签列表完整,您可以使用正则表达式

\b(TRSF|SND|ORG|OGB|OBI)\b=?\s*(.*?)(?=\s*\b(?:TRSF|SND|ORG|OGB|OBI)\b|\Z)

请参阅正则表达式演示。细节:

  • \b- 单词边界
  • (TRSF|SND|ORG|OGB|OBI)- 捕获到第 1 组的标签
  • \b- 单词边界
  • =?- 一个可选的=
  • \s*- 0+ 个空格
  • (.*?)- 第 2 组:任何零个或多个字符,尽可能少
  • (?=\s*\b(?:TRSF|SND|ORG|OGB|OBI)\b|\Z)- 字符串结尾 ( \Z) 或零个或多个空格后跟一个标签作为一个完整的单词。

请参阅Python 演示

import re
s='TRSF BOOK TRANSFER CREDIT SND= abcd bank , 123  ORG= qwer123 OGB= qwerasd OBI= 123433'
tags =  ['TRSF','SND','ORG','OGB','OBI']
print( dict(re.findall(fr'\b({"|".join(tags)})\b=?\s*(.*?)(?=\s*\b(?:{"|".join(tags)})\b|\Z)', s.strip(), re.DOTALL)) )
# => {'TRSF': 'BOOK TRANSFER CREDIT', 'SND': 'abcd bank , 123', 'ORG': 'qwer123', 'OGB': 'qwerasd', 'OBI': '123433'}

请注意re.DOTALL(equal to re.S).匹配任何字符,包括换行字符。


推荐阅读