首页 > 解决方案 > 使用正则表达式 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

有没有办法使用正则表达式来做到这一点?

标签: pythonregexpython-3.xregex-group

解决方案


由于您最重要的问题是正确拆分字符串,因此我仅尝试解决此问题。您可以在之后附加和预先添加|

这种模式似乎有效:

(XYZ|CREF|BREF|RREF|REF):[a-zA-Z\\s]+?(LLC)?(?=(XYZ|CREF|BREF|RREF|REF)|$)

解释:

  1. (XYZ|CREF|BREF|RREF|REF): :这很明显。您正在寻找标签的开头。顺序很重要。也就是说,将最短的子字符串保留REF在末尾。
  2. [a-zA-Z\\s]+? :不情愿地匹配标签后出现的任何字符和空格。不情愿,因为如果引擎到达 的开头CREF,我们希望它停在那里而不是“贪婪地”获取更多字符。由于使用“不情愿”,第 (4) 点中的标签顺序很重要。
  3. (LLC)? 这是一种以标签开头的字符序列结尾的所有已知单词的例外列表。(为此,我想不出任何其他方式。)异常列表必须是已知的,并且可以单独配置并附加到模式运行时。如果预先知道输入数据结构并且此类异常是有限且已知的,则这不是瓶颈。否则,是的。
  4. (?=(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 )

推荐阅读