regex 如何修改python正则表达式来检查字符串元素是否存在于另一个字符串中?

8wtpewkr  于 2023-03-24  发布在  Python
关注(0)|答案(3)|浏览(102)

我知道我也问过类似的问题,但我想稍微修改一下,以适应新的特定用例。
我有一个字符串,如SIT,UAT,称之为a1, a2,其中a1a2可以是由,分隔的任何字符序列。也可以有任何数量的唯一元素,如a3a4。这些a1a2(最多aN)元素在每个a1, a2组合中只出现一次。
我需要一个python正则表达式,它允许我检查是否只有(SITUAT)存在于由,分隔的特定字符串中,如果在输入的列表中有超过1个元素。
场景:
输入1:SIT,UAT

  1. SIT,UAT-应该与regex匹配
  2. UAT,SIT-应该与regex匹配
  3. SIT-应失败,因为SIT和UAT未同时存在
  4. UAT-应失败,因为SIT和UAT未同时存在
  5. TRA,SIT,UAT-应失败,因为只有SIT和UAT必须与其他元素一起存在,因为TRA未在输入列表中提供
    先谢了!
xwbd5t1u

xwbd5t1u1#

你可能想在这里使用的正则表达式是:

^(?:SIT,UAT|UAT,SIT)$

示例Pandas代码:

def valid(env1, env2):
    pat = r'^(?:' + env1 + r',' + env2 + r'|' + env2 + r',' + env1 + r')$'
    return df["col"].str.contains(pat, regex=True)

如果你需要满足两个以上的预期CSV值,那么regex可能无法很好地扩展。在这种情况下,我建议将输入拆分为逗号,然后使用基本字符串函数:

inp = "TST,SIT,UAT,PROD"
vals = inp.split(",")
allowed = ["SIT", "UAT"]
output = all(p in allowed for p in vals)
print(output)  # False, because the input has TST and PROD
jecbmhm3

jecbmhm32#

如果我没理解错的话,这是一个解决问题的方法。除非你的匹配值固定为SIT,UAT或者只有几个已知值,否则我建议你不要使用正则表达式,而是通过拆分列表来解决它。

def verify(input, match):
    matchList = list(sorted(match.split(',')))
    inputList = list(sorted(input.split(',')))
    return inputList == matchList

match = "SIT,UAT"
print(verify("SIT,UAT", match))     # true
print(verify("UAT,SIT", match))     # true
print(verify("SIT", match))         # false
print(verify("UAT", match))         # false
print(verify("TRA,SIT,UAT", match)) # false

上面的代码对match字符串没有任何假设。如果你知道重复并不重要,你可以使用set比较来代替list

vof42yt1

vof42yt13#

使用上述模式:

pattern = ^(?=^(SIT,UAT)|(UAT,SIT)$)(?!(.*?,(?!SIT|UAT))+).*
  • (?=^(SIT,UAT)|(UAT,SIT)$)用于检查字符串是否匹配SIT,UAT或UAT,SIT...
  • (?!(.*?,(?!SIT|UAT))+)用于检查字符串是否与除SIT & UAT之外的任何元素都不匹配

希望这个有用。

相关问题