python - 使用正则表达式在标签和标签列表之间查找元素
问题描述
我想在两个不同的标签之间找到元素,但要注意的是第一个标签是不变的,但第二个标签可以是属于特定列表的任何标签。
例如一个字符串
'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>
或任何其他方法?
解决方案
如果标签列表完整,您可以使用正则表达式
\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
).
匹配任何字符,包括换行字符。
推荐阅读
- caching - 点燃现有 Cassandra 上的缓存
- python - 有条件地编辑时间日期索引,检查数据框中的先前记录
- android - RxJava toMultiMap 不适用于房间数据库查询
- python - 取 NavigatableList 的第二个元素
- c# - 制作一个 FiveM 启动器
- c++ - 如何将数组从一个类发送到另一个类
- scala - scala compile error :当 Jersey 客户端注册时匹配参数类型
- python - 在 Windows 上使用邮递员在 centos6 上点击 django API
- react-native - 使用 React Native 通过 Twilio 发送短信 (SMS)?
- android - 从android中的应用程序启动拨号器会出错