python - 使用正则表达式 python 由 `|` 分隔的标签中的错误
问题描述
我想|
在每个标签之前添加。请检查我使用的以下代码。
tags = ['XYZ', 'CREF', 'BREF', 'RREF', 'REF']
string_data = 'XYZ:MUMBAI UNIVERSITYCREF:PUNE UNIVERSITYBREF:DADAR UNIVERSITYRREF:KOLHAPUR UNIVERCITY LLCREF:SOLAPUR UNIVERSITY'
for each_tag in tags:
result = string_data.replace(each_tag, "|" + each_tag)
print(result)
我如何使用正则表达式来做到这一点?
输入字符串:
XYZ:MUMBAI UNIVERSITYCREF:PUNE UNIVERSITYBREF:DADAR UNIVERSITYRREF:KOLHAPUR UNIVERCITY LLCREF:SOLAPUR UNIVERSITY
实际结果(错误):
XYZ:MUMBAI UNIVERSITYC|REF:PUNE UNIVERSITYB|REF:DADAR UNIVERSITYR|REF:KOLHAPUR UNIVERCITY LLC|REF:SOLAPUR UNIVERSITY
预期结果:
|XYZ:MUMBAI UNIVERSITY|CREF:PUNE UNIVERSITY|BREF:DADAR UNIVERSITY|RREF:KOLHAPUR UNIVERCITY LLC|REF:SOLAPUR UNIVERSITY
有没有办法使用正则表达式来做到这一点?
解决方案
由于您最重要的问题是正确拆分字符串,因此我仅尝试解决此问题。您可以在之后附加和预先添加|
。
这种模式似乎有效:
(XYZ|CREF|BREF|RREF|REF):[a-zA-Z\\s]+?(LLC)?(?=(XYZ|CREF|BREF|RREF|REF)|$)
解释:
(XYZ|CREF|BREF|RREF|REF):
:这很明显。您正在寻找标签的开头。顺序很重要。也就是说,将最短的子字符串保留REF
在末尾。[a-zA-Z\\s]+?
:不情愿地匹配标签后出现的任何字符和空格。不情愿,因为如果引擎到达 的开头CREF
,我们希望它停在那里而不是“贪婪地”获取更多字符。由于使用“不情愿”,第 (4) 点中的标签顺序很重要。(LLC)?
:这是一种以标签开头的字符序列结尾的所有已知单词的例外列表。(为此,我想不出任何其他方式。)异常列表必须是已知的,并且可以单独配置并附加到模式运行时。如果预先知道输入数据结构并且此类异常是有限且已知的,则这不是瓶颈。否则,是的。(?=(XYZ|CREF|BREF|RREF|REF)|$)
:前瞻,以确保引擎在发现其中一个标签出现时停止。$
如果没有更多标签,则允许在输入结束时停止。
这将为您提供的输入字符串提供以下输出:
XYZ:MUMBAI UNIVERSITY
CREF:PUNE UNIVERSITY
BREF:DADAR UNIVERSITY
RREF:KOLHAPUR UNIVERCITY LLC
REF:SOLAPUR UNIVERSITY
编辑
添加我测试过的 Python 3.8.1 代码:
import re
s = "XYZ:MUMBAI UNIVERSITYCREF:PUNE UNIVERSITYBREF:DADAR UNIVERSITYRREF:KOLHAPUR UNIVERCITY LLCREF:SOLAPUR UNIVERSITY"
p = "(XYZ|CREF|BREF|RREF|REF):[a-zA-Z\\s]+?(LLC)?(?=(XYZ|CREF|BREF|RREF|REF)|$)"
matches = re.finditer( p,s )
tag_list = [ m.group() for m in matches ]
s2 = "|" + "|".join( tag_list )
print( s2 )
推荐阅读
- android - 无法使用 FirebasePushNotificationPlugin [Xamarin][Android] 将构建操作设置为 GoogleServicesJson
- android - 为什么最大长度过滤器不起作用?安卓
- javascript - 单击复选框时如何使未选中的复选框标签变灰?
- javascript - jQuery Datatable:标题和搜索在同一行
- django - gitignore 如何排除一个表
- c# - Visual Studio 安装程序项目多语言支持
- python - 谷歌专利刮美丽汤
- javascript - 提交后如何从下拉列表中删除选定的值
- python - matplotlib // 子图之间的空间
- python-3.x - 如何在 Python 3.6 中将我的子命令拆分为多个文件并单击 7.1.2